如何将 SourcePageType 转换为页面?

How to cast SourcePageType as Page?

我目前正在构建一个 WinRT 应用程序,但我正面临这个问题。

我想要实现的是我需要读取或修改我导航的上一页的属性。

假设我有两个页面:MainPageWatchPage

我正在从 MainPage 导航到 WatchPage,在 WatchPage's OnNavigatedTo 事件中我需要访问 MainPage 中的 属性不使用导航参数...

我怎样才能做到这一点?

protected override void OnNavigatedTo(NavigationEventArgs e){
    Type LastPage = rootFrame.BackStack.Last().SourcePageType;

    if(LastPage == typeof(MainPage){
        // here, for example, say that MainPage has a property called isLoadSuccess
        // I need to set that property to false
        // or call a method from MainPage
        // => this is not working MainPage MP = LastPage as MainPage;
        // I know that it should not work anyway, but, how can I achieve this?
    }
}

我建议创建一个带有静态属性和方法的静态 class。我不认为你试图实现的是一个好的做法。相反,这是我的例子:

   public static class Shared
    {
        public static string property = "something..";

        public static async Task<bool> Method()
        {
            await Task.Delay(400);
            return false;
        }
    }

然后,您可以调用该方法,从任何位置获取或设置 属性:

bool result = await Shared.Method();

您尝试做的事情无法使用现有框架完成。也就是说,BackStack 中不存在对您上一页实例的引用。老实说,唯一存在的是重新创建实例的方法。也就是说,BackStack中包含了类型和参数。有了这两个元素,当用户在框架中导航回到它时,您应该能够重新实例化 class。顺便说一句,这些成分包括类型和可序列化参数 - 只有使用可序列化参数,应用程序才能将 BackStack 保存到 NavigationState 并在您的应用程序 suspended/terminated 时可靠地恢复它。

故事就是这样,现在来解决您的问题。老实说,我看到了几种可能的解决方案,我认为其中任何一种都可以接受。

第一个警告是您必须使用 NavigationCacheMode = Enabled。如果没有这个,您的页面(包括前一页)将在每次导航时重新创建,包括返回。这是 UWP 的一个重要行为,因为它假定您的页面已从内存中删除以节省整体占用空间。设置 NavigationCacheMode 将覆盖它。

  1. 创建静态引用

这很简单吧?像这样:

public readonly static MainPage Instance;
public MainPage() {
    Instance = this;
} 

Beware of this, because it requires your views to have a reference to each other. This is a pretty minimal risk, IMHO.

  1. 传递参考

使用像这样的 Navigate(parameter) 最容易完成。

// MainPage
public void GoAway() {
    this.Frame.Navigate(typeof(SecondPage), this);
} 

// SecondPage
MainPage MainPage;
public void OnNavigatedTo(object parameter) {
    MainPage = parameter as MainPage;
} 

Beware of this because it requires you to pass something that cannot be serialized. Sometimes, though, this is acceptable.

这些有道理吗?

祝你好运。