【问题标题】:Passing parameters to a WPF Page via its Uri通过 Uri 将参数传递给 WPF 页面
【发布时间】:2010-11-24 00:08:12
【问题描述】:

在导航风格的 WPF 应用程序(NavigationWindow,而不是 XBAP)的上下文中:

超链接的 NavigateUri 是否可以包含额外的参数,例如路径数据或查询字符串?例如,有什么方法可以将我的 NavigateUri 设置为 /Product.xaml/123/Product.xaml?id=123,并让我的 Product.xaml 页面能够看到它是使用 123 的参数调用的?

【问题讨论】:

    标签: wpf navigation query-string navigateuri


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多