【问题标题】:NavigationWindow - Where is it?NavigationWindow - 它在哪里?
【发布时间】:2010-08-15 13:23:41
【问题描述】:

我的 WPF 应用程序变得非常痛苦。我创建了一个窗口,并希望在单击按钮时加载另一个页面。我以为这很简单,但似乎并非如此。我设法使用this.content = new UserPage() 加载另一个页面。但是,从这个 UserPage,我无法回到我的主窗口。我不能使用this.content,因为窗口不能是孩子。

因此,我四处搜索,发现我应该使用 NavigationService 来让事情变得更容易。我尝试使用 NavigationService.GetNavigationService(this) 但这不起作用,因为它总是返回 null。我想这是因为我的主窗口来自Window 而不是NavigationWindow。有没有办法在不重新启动项目的情况下将我的 Window 转换为 NavigationWindow?每当我创建一个新文件时,都没有 NavigationWindow 模板 - 只有 Window、Page、User Control 等......

我尝试用 NavigationWindow 手动替换 XAML,它运行良好,但 NavigationService 方法仍然返回 null。顶部还有一个带有向后和向前箭头的栏(均已禁用),但我真的不需要这个。我只想使用Navigate() 方法,以便我可以轻松地在页面之间切换。 关于我能做什么的任何想法?

感谢您的帮助,这让我发疯了! :)

【问题讨论】:

    标签: c# wpf navigation navigationwindow


    【解决方案1】:

    我尝试手动替换 XAML 使用 NavigationWindow 并且运行良好, 但 NavigationService 方法仍然 返回null

    如果您的窗口已经是NavigationWindow,则不需要NavigationServiceNavigationWindow 有一个 Navigate 方法。

    您也可以使用标准的Window 并在其上放置Frame 控件。它的工作原理大致类似于NavigationWindow,只是它嵌入在一个窗口中

    【讨论】:

    • 感谢您的回复。如何在窗口中插入框架?我有一个网格(包含整个布局),但是当我在窗口中放置一个框架时,它会替换网格。有没有办法将框架插入现有窗口?再次感谢
    • 将框架放入网格内
    • 那行得通。我试图将我的布局放在框架本身内。相反,我只是将框架放在可视化树的顶部并调用它的 Navigate() 方法,该方法似乎正在工作。感谢您的帮助。
    • 嗨 @ThomasLevesque 有没有办法在 MVVM 中使用 NavigateService?
    • @ArijitMukherjee,是的,但是您应该将其抽象到接口后面,以便 ViewModel 不会直接操作 UI 对象(并提高可测试性)。
    【解决方案2】:

    斯考德,

    我不太确定你想做什么,但我会看看能不能帮上忙。首先,听起来你想要一个 NavigationWindow。如果您的应用程序中只需要一个页面,那么您的第一种方法将起作用,但是当您谈论多个页面并希望从一个页面移动到另一个页面时,您就是在谈论 NavigationWindow。

    其次,一旦你选择了一个导航窗口,XAML 应该是直截了当的,只需将 Window 替换为 NavigationWindow 就可以了,除非你现在需要意识到你将不再直接控制窗口的内容。相反,内置 NavigationService 将处理此问题。哦,您不需要创建显式 NavigationService,因为该类已经提供了一个。您只需要导航:

     this.Navigate(new Url("pack://aplication:,,,/MyAssembly,component/MyPage.xaml", UriKind.Absolute));
    

    或者,可以使用 XAML:

    Source = "pack://aplication:,,,/MyAssembly,component/MyPage.xaml"
    

    此时,您将需要一些界面来允许您的用户从一个页面转到下一个页面(例如面包屑控件或 TreeView),但是一旦他们在那里,内置的旅行控件将允许您浏览为您自动维护的日志。也就是说,导航的大部分基本工作都是为您完成的,您只需要弄清楚用户如何向前导航到某些内容即可。

    但是在这一点上,事情会变得很奇怪。我自己遇到了这个。由于您无法向框架中显式添加网格或任何其他内容,因此您需要更改 NavigationWindow 的模板以添加构成普通应用程序的额外控件。诸如菜单和工具栏之类的东西不是标准 WPF 导航窗口的一部分。

    请原谅这种无耻的自我推销,但我开发了一个产品,因为我遇到了这些限制,并且市场上没有任何可用的产品。您可以在以下位置查看演示:

    http://www.teraque.com/products/explorer-chrome-suite/

    它被设计成微软免费提供的 WPF NavigationControl 的专业版。看一下演示,如果您不想购买套件,如果这是您想要应用程序的方向,我很乐意给予指点。

    此致,

    唐纳德·罗伊·艾雷

    donald.roy.airey@teraque.com

    【讨论】:

      【解决方案3】:

      我已经这样做了,但无法弄清楚如何从位于框架中的页面中的 vb.net 语句重新加载父窗口。 我希望执行 window_loaded 函数中有一些代码。

      【讨论】:

      • 你在使用navigationservice.goback吗?
      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多