我在这类问题上看到了许多线索,但似乎没有一条适用于我的问题。我没有导航页面,我有汉堡包菜单--所以Push/PopAsync()似乎不是答案。我不想进入特定的页面,我想回到上一页(不管是什么),这样GoToAsync()就不会成为答案。
iOS的安卓和UWP的Xamarin应用程序在未来的某个地方。下面对这个问题的描述是针对Android的;它在UWP上的工作方式有点不同。
我想在汉堡包菜单中放一个帮助条目,它将把用户带到默认浏览器中的帮助页面。汉堡包菜单似乎只进入应用程序页面,所以我定义了一个显示“加载.”的“虚拟”视图页面。并在其Browser.OpenAsync()方法中发布OnAppearing(),这几乎是可行的。问题是,用户希望“后退”按钮在单击“帮助”之前将他或她带到他们所在的页面。我试了几样东西。我已经接近了以下几点,但它不能完全正确地工作:
在我的其他视图的OnAppearing()中,我都调用了一个在静态中保存Current.MainPage.CurrentItem值的方法。然后,在OpenAsync()之后的帮助页中,我从帮助页之前的最后一个页面将Current.MainPage.CurrentItem设置为它的设置。
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;
它几乎成功了。当我第一次点击汉堡包菜单中的帮助时
#### HelpPage loading Web Help
#### HelpPage returning to previous page
#### HelpPage loading Web Help
#### HelpPage returning to previous page
网页加载得很好。但当我单击“后退”按钮时,它会再次显示。显然,我的OnAppearing()方法已经被驱动了两次,我不明白。
如果我再次单击“后退”按钮,我将返回到应用程序中的前一页,正如我所希望的那样。下次我单击“汉堡”菜单中的“帮助”时,它会带我到没有网页的虚拟视图页面。显然,我的OnAppearing()根本没有被驱动。但在那之后,它就完美地运作了。我可以转到任何应用程序页面,然后点击菜单中的帮助。我得到网页,后退按钮带我回到应用程序和页面。当然,在UWP中,浏览器不会在应用程序视图的顶部加载,而且我似乎每次都会看到它被加载两次。
所以..。我该怎么做?为什么我的OnAppearing()被驱动了两次,然后一点也没有.然后就像我预料的那样?
发布于 2021-12-11 17:36:42
这个答案有几个部分:
App.xaml.cs:
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:
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:
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中的静态变量进行通信。根据你的情况重新考虑。
https://stackoverflow.com/questions/70320032
复制相似问题