首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Xamarin表单AppShell如何返回到上一页

Xamarin表单AppShell如何返回到上一页
EN

Stack Overflow用户
提问于 2021-12-11 16:16:34
回答 1查看 1K关注 0票数 2

我在这类问题上看到了许多线索,但似乎没有一条适用于我的问题。我没有导航页面,我有汉堡包菜单--所以Push/PopAsync()似乎不是答案。我不想进入特定的页面,我想回到上一页(不管是什么),这样GoToAsync()就不会成为答案。

iOS的安卓和UWP的Xamarin应用程序在未来的某个地方。下面对这个问题的描述是针对Android的;它在UWP上的工作方式有点不同。

我想在汉堡包菜单中放一个帮助条目,它将把用户带到默认浏览器中的帮助页面。汉堡包菜单似乎只进入应用程序页面,所以我定义了一个显示“加载.”的“虚拟”视图页面。并在其Browser.OpenAsync()方法中发布OnAppearing(),这几乎是可行的。问题是,用户希望“后退”按钮在单击“帮助”之前将他或她带到他们所在的页面。我试了几样东西。我已经接近了以下几点,但它不能完全正确地工作:

在我的其他视图的OnAppearing()中,我都调用了一个在静态中保存Current.MainPage.CurrentItem值的方法。然后,在OpenAsync()之后的帮助页中,我从帮助页之前的最后一个页面将Current.MainPage.CurrentItem设置为它的设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Console.WriteLine("#### HelpPage loading Web Help");
_ = State.DisplayHelpPage(this, "MainHelp");        // _ = await Browser.OpenAsync(uri, blo);
Console.WriteLine("#### HelpPage returning to previous page");
State.ReloadPreviousPage();     // Current.MainPage).CurrentItem = lastFlyoutItem;

它几乎成功了。当我第一次点击汉堡包菜单中的帮助时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#### HelpPage loading Web Help
#### HelpPage returning to previous page
#### HelpPage loading Web Help
#### HelpPage returning to previous page

网页加载得很好。但当我单击“后退”按钮时,它会再次显示。显然,我的OnAppearing()方法已经被驱动了两次,我不明白。

如果我再次单击“后退”按钮,我将返回到应用程序中的前一页,正如我所希望的那样。下次我单击“汉堡”菜单中的“帮助”时,它会带我到没有网页的虚拟视图页面。显然,我的OnAppearing()根本没有被驱动。但在那之后,它就完美地运作了。我可以转到任何应用程序页面,然后点击菜单中的帮助。我得到网页,后退按钮带我回到应用程序和页面。当然,在UWP中,浏览器不会在应用程序视图的顶部加载,而且我似乎每次都会看到它被加载两次。

所以..。我该怎么做?为什么我的OnAppearing()被驱动了两次,然后一点也没有.然后就像我预料的那样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-11 17:36:42

这个答案有几个部分:

  1. 将上一页放到导航堆栈上。这是通过拦截路由"//HelpPage“来实现的,并将其替换为一个不是Shell.
  2. Remember "FakePageVisible”的子路由,因此我们知道,当应用程序从browser.
  3. (Optional)返回"PopAsync“时,输入”标志“可以防止两次进入浏览器。

App.xaml.cs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class App : Application
{

    public App()
    {
        InitializeComponent();

        MainPage = new AppShell();
    }

    protected override void OnResume()
    {
        if (HelpPage.FakePageVisible) {
            HelpPage.FakePageVisible = false;
            var shell = MainPage as AppShell;
            if (shell != null) {
                shell.Navigation.PopAsync();
            }
        }
    }
}

AppShell.xaml.cs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class AppShell : Xamarin.Forms.Shell
{
    public AppShell()
    {
        InitializeComponent();
        // Define a route that isn't a child of Shell.
        Routing.RegisterRoute("Help2", typeof(HelpPage));
    }

    protected override void OnNavigating(ShellNavigatingEventArgs args)
    {
        base.OnNavigating(args);

        if (args.Current != null) {
            if (args.Source == ShellNavigationSource.ShellItemChanged) {
                if (args.Target.Location.OriginalString == "//HelpPage") {
                    // Cancel the original route.
                    args.Cancel();
                    Device.BeginInvokeOnMainThread(() => {
                        // Used by the next OnAppearing.
                        HelpPage.Entering = true;
                        // Go there by a route that isn't a child of Shell.
                        // Doing so, pushes our previous location on to Navigation stack.
                        Shell.Current.GoToAsync("Help2");
                    });
                }
            }
        }
    }
}

HelpPage.xaml.cs:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public partial class HelpPage : ContentPage
{
    public static bool Entering;
    public static bool FakePageVisible;
    
    protected override void OnAppearing
    {
        // Make sure this only happens once (just in case).
        if (Entering) {
            Entering = false;
            FakePageVisible = true;
            Xamarin.Essentials.Browser.OpenAsync("https://aka.ms/xamarin-quickstart");
        }
    }
}

对于一个简单的演示,这段代码通过HelpPage中的静态变量进行通信。根据你的情况重新考虑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70320032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文