【发布时间】:2019-01-06 05:14:07
【问题描述】:
我正在开发一个有两个页面的 UWP 应用程序,我想要在页面之间传递参数的最佳实践。 我也想不断重复传递信息
以下场景的最佳方法是什么?
例如,更改页面中的用户控件。 我们有两个页面,每个都打开并保持在屏幕中间,每个页面上都有一个按钮,当我们点击另一个页面时,它会改变另一个页面的背景颜色。
感谢您的帮助,
【问题讨论】:
-
请帮帮我,关注这个帖子My senario
我正在开发一个有两个页面的 UWP 应用程序,我想要在页面之间传递参数的最佳实践。 我也想不断重复传递信息
以下场景的最佳方法是什么?
例如,更改页面中的用户控件。 我们有两个页面,每个都打开并保持在屏幕中间,每个页面上都有一个按钮,当我们点击另一个页面时,它会改变另一个页面的背景颜色。
感谢您的帮助,
【问题讨论】:
您可以提供导航参数作为Frame.Navigate 方法的第二个参数:
Frame.Navigate(typeof(SecondPage),"something");
然后获取第二页的OnNavigatedTo中的参数覆盖:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
var data = (string)e.Parameter; //"something"
...
}
建议作为重复的答案没有提到一个重要的事实 - 参数只能是启用导航状态序列化的基本类型。正如文档所说:
要使用 GetNavigationState 启用帧状态序列化,您必须仅使用基本类型的导航参数,例如字符串、字符、数字和 GUID 类型。否则 GetNavigationState 将在应用挂起时抛出异常。如果不使用 GetNavigationState,参数可以有其他类型。
即使您不需要支持暂停和帧状态序列化,最好还是坚持使用简单的参数并可能将日期存储在其他地方。再次来自文档:
如果不使用 GetNavigationState,参数值可以具有复杂类型。但是,您仍应仅使用基本类型,以便避免由于框架的导航堆栈持有对参数的引用而导致的过多内存使用。一种首选方法是不传递实际对象,而是传递可用于在目标登录页面中查找对象的标识符。例如,不要传递 Customer 对象,而是传递对 CustomerID 的引用,然后在导航完成后查找 Customer。
如果我需要传递一个复杂的对象,我通常倾向于使用JSON序列化将其变成string,然后在目标页面中进行反序列化。为此,您可以使用很棒的Json.NET library。
【讨论】:
Frame.Navigate(typeof(SecondPage),"something"); 创建并打开新页面。我也想不断地传递信息
Frame 控件 - 每个控件将承载不同的页面堆栈。