0

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

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

因此,假设我有两个页面:MainPageWatchPage.

我正在WatchPage从事件导航到事件MainPage内部和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?
    }
}
4

2 回答 2

1

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

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

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

  1. 创建静态引用

这很容易吧?像这样的东西:

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

请注意这一点,因为它要求您的观点相互参考。恕我直言,这是一个非常小的风险。

  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;
} 

请注意这一点,因为它要求您传递无法序列化的内容。不过,有时这是可以接受的。

这些都有意义吗?

祝你好运。

于 2016-03-31T20:26:58.483 回答
0

我建议使用静态属性和方法创建一个静态类。我认为您尝试实现的不是一个好习惯。相反,这是我的示例:

   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();
于 2016-03-29T13:52:47.490 回答