通过 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 页面的主要内容,如果未能解决你的问题,请参考以下文章

如何通过将参数传递给 URL 来使用 jQuery 刷新页面

将参数传递给页面,数据不更新

通过javascript将参数传递给动作不会传递整数值

将参数传递给视图中的操作

如何将参数传递给servlet

通过 javascript 将复杂参数传递给 Web API 服务