【问题标题】:WPF: Composite Application with Page NavigationWPF:具有页面导航的复合应用程序
【发布时间】:2010-01-19 20:34:41
【问题描述】:

我目前正在编写一个应用程序,复合方法就像手套一样适合......几乎!

我还需要一种在视图之间导航的方法,包括维护用于向后和向前导航的日志。

结合这两种方法的最佳方式是什么,一方面是基于 Window 的单个 CAG shell 及其 UserControl 派生视图,另一方面是方便的 NavigationWindow shell 及其 Page 派生视图观点和日记?

谢谢!

【问题讨论】:

    标签: wpf navigation composite


    【解决方案1】:

    您可以在NavigationWindow 中显示任何内容,而不仅仅是Pages。使其工作的一个简单方法是在NavigationWindow 的资源中为要显示的每个 ViewModel 定义一个DataTemplate。将NavigationWindowContent 属性绑定到您的主ViewModel 的属性,您就完成了:更改该属性将更新NavigationWindow 内容,并且将自动选择适当的DataTemplate


    更新

    我刚刚查看了我使用NavigationWindow 的项目的代码。实际上我弄错了,绑定Content 不起作用(或者它可能起作用,但这不是我所做的)。相反,我创建了一个INavigationService 接口,由我的App 类实现,它通过调用NavigationWindow.Navigate 方法来处理导航。这样,导航历史记录由NavigationWindow 维护。

    这是我项目的摘录

    MainWindow.xaml:

    <NavigationWindow x:Class="MyApp.MainWindow"
                      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      xmlns:vm="clr-namespace:MyApp.ViewModel"
                      xmlns:view="clr-namespace:MyApp.View"
                      Title="{Binding Content.DisplayName, RelativeSource={RelativeSource Self}, FallbackValue=The Title}"
                      Height="600" Width="800">
        <NavigationWindow.Resources>
            <DataTemplate DataType="{x:Type vm:HomeViewModel}">
                <view:HomeView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type vm:CustomerViewModel}">
                <view:CustomerView />
            </DataTemplate>
        </NavigationWindow.Resources>
    </NavigationWindow>
    

    App.xaml.cs

        ...
    
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            LoadConfig();
    
            MyApp.MainWindow window = new MainWindow();
            INavigationService navigationService = this;
            HomeViewModel viewModel = new HomeViewModel(navigationService);
            this.MainWindow = window;
            window.Navigate(viewModel);
            window.Show();
        }
    

    当我需要导航到另一个视图时,我只需以 ViewModel 作为参数调用Navigate 方法,WPF 就会自动从资源中选择适当的DataTemplate

    【讨论】:

    • 这是一个不错且简单的解决方案,但对我来说有点太简单了。我遇到的问题:日记、视图生命周期管理、视图状态、导航历史中的多个视图、PageFunction 功能(能够以模态方式调用视图)。或者我不完全理解你的解决方案,你能详细说明一下吗?
    • 另一个问题是以相对独立的方式(与外壳分离)开发视图的能力。基本上,您是说我根本不应该使用 CAG,而是使用一种变通方法使常规的 NavigationWindow 感觉像 CAG。但后来我失去了 CAG 提供的优势、模块的动态加载、独立的模块开发等。
    • 感谢您提供更多详细信息,Thomas,但我仍然不高兴。你说的是“创建一个常规的导航应用程序,并自己实现 CAG 部分”——这意味着我需要提供一个统一容器、模块的动态加载、视图数据模板的动态创建等。我宁愿反过来,使用 CAG 并自己实现导航和日志。 +1 至少向我展示了我不想想做的事情:-)
    • 其实我没用过CAG,也不太了解。我的应用程序只是一个简单的 MVVM 应用程序,没有使用任何特定的框架,上面描述的技术工作得很好,但对于 CAG 来说可能还不够......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多