通过 Uri 将参数传递给 WPF 页面
Posted
技术标签:
【中文标题】通过 Uri 将参数传递给 WPF 页面【英文标题】:Passing parameters to a WPF Page via its Uri 【发布时间】:2010-11-24 00:08:12 【问题描述】:在导航风格的 WPF 应用程序(NavigationWindow,而不是 XBAP)的上下文中:
超链接的 NavigateUri 是否可以包含额外的参数,例如路径数据或查询字符串?例如,有什么方法可以将我的 NavigateUri 设置为 /Product.xaml/123
或 /Product.xaml?id=123
,并让我的 Product.xaml 页面能够看到它是使用 123
的参数调用的?
【问题讨论】:
【参考方案1】:你可以这样做。见http://www.paulstovell.com/wpf-navigation:
虽然不明显,但你可以 将查询字符串数据传递给页面,以及 从路径中提取它。例如, 您的超链接可以传递一个值 URI:
<TextBlock> <Hyperlink NavigateUri="Page2.xaml?Message=Hello">Go to page 2</Hyperlink> </TextBlock>
页面加载完成后, 通过提取参数
NavigationService.CurrentSource
,哪个 返回一个 Uri 对象。那么它可以 检查 Uri 以拆开 价值观。不过,我强烈推荐 反对这种方法,除了在 最可怕的情况。更好的方法是使用 过载为 NavigationService.Navigate 需要 参数的对象。你可以 自己初始化对象,因为 示例:
Customer selectedCustomer = (Customer)listBox.SelectedItem; this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer));
这假定页面构造函数 接收 Customer 对象作为 范围。这可以让你通过 页面之间的信息更丰富, 并且无需解析字符串。
【讨论】:
您的 NavigationService 调用属于哪里?在超链接的点击处理程序中?这似乎会在后面的代码中导致大量额外的布线。 是的,就像在 ASP.NET MVC 中呈现超链接的代码进入视图,而不是模型/控制器一样。从一个视图到另一个视图的导航应该是一个视图问题。 在某种程度上它看起来像 ASP.NET MVC:“超链接”将在视图上,但它会调用某些东西来执行页面更改。我创建了一个控制器来执行此操作,它使用静态方法和静态“MainWindow”对象,其中包含显示我所有页面的框架。如果我想更改页面,我只需调用“MainController.ChangePage(page)”即可。 请注意,MSDN 官方文档建议在 URL 中传递参数:msdn.microsoft.com/en-us/library/ff626521(v=vs.92).aspx;此外,Naviagte 方法似乎没有将页面作为参数,而只是一个 URI 对象【参考方案2】:另一种方法是在命运页面上创建一个公共变量,并使用 get/set 属性为其赋值。
在页面上:
private Int32 pMyVar;
public Int32 MyVar
get return this.pMyVar;
set this.pMyVar = value;
导航到它时:
MyPagePath.PageName NewPage = new MyPagePath.PageName();
NewPage.MyVar = 10;
this.MainFrameName.NavigationService.Navigate(NewPage);
加载 NewPage 时,整数 MyVar 将等于 10。 MainFrameName 是您正在使用的框架,以防您使用框架,但如果不是,则导航命令仍然保持不变。 这是我的意见,但这样跟踪它似乎更容易,并且对那些在 WPF 之前来自 C# 的人更友好。
【讨论】:
【参考方案3】:Customer selectedCustomer = (Customer)listBox.SelectedItem;
this.NavigationService.Navigate(new CustomerDetailsPage(selectedCustomer));
Paul Stovell 我认为使用您的建议将使您的页面不会被垃圾收集 因为整个实例将保留在 Journal 上。
【讨论】:
第一个建议将启用收集。如果您调用 NavigationService.RemoveBackEntry 足够多次以“清除”日志,则仍然可以收集第二个建议。不过,WPF 框架确实很糟糕:paulstovell.com/magellan-page-management以上是关于通过 Uri 将参数传递给 WPF 页面的主要内容,如果未能解决你的问题,请参考以下文章