如何将 SourcePageType 转换为页面?
How to cast SourcePageType as Page?
我目前正在构建一个 WinRT 应用程序,但我正面临这个问题。
我想要实现的是我需要读取或修改我导航的上一页的属性。
假设我有两个页面:MainPage
和 WatchPage
。
我正在从 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 将覆盖它。
- 创建静态引用
这很简单吧?像这样:
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.
- 传递参考
使用像这样的 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.
这些有道理吗?
祝你好运。
我目前正在构建一个 WinRT 应用程序,但我正面临这个问题。
我想要实现的是我需要读取或修改我导航的上一页的属性。
假设我有两个页面:MainPage
和 WatchPage
。
我正在从 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 将覆盖它。
- 创建静态引用
这很简单吧?像这样:
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.
- 传递参考
使用像这样的 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.
这些有道理吗?
祝你好运。