将我的多窗口WPF应用程序转换为单窗口?

3
我制作了一个WPF应用程序,根据用户的交互打开连续的窗口。例如,第一个窗口询问用户要在哪个模块上工作,当进行选择并按下按钮时,会打开一个新窗口显示一些供应商和摘要计数。选择其中一个供应商,并按下编辑按钮,会打开另一个窗口显示该供应商的详细信息。点击详细信息然后按下按钮,将打开另一个窗口,在该窗口中用户可以更改某些数字等。然后用户关闭该窗口、选择不同的项目并进行编辑,或者关闭该窗口并选择不同的供应商等。目前每个窗口都有自己的视图模型。我想要摆脱所有这些窗口层次结构。选项卡控件似乎不是一个好的选择,因为用户必须按照正确的顺序进行操作等等。仅使用一个窗口并在用户按下按钮以编辑等操作时切换用户在一个窗口中看到的内容的最佳方法是什么?

1
这是另一个 StackExchange 网站 用户体验 上的一个好问题。 - Adriano Repetti
制作一个主容器,然后通过窗口导航是一个好的解决方案吗?如果是这样,您可以尝试使用“UserControl”,它允许您进行导航。 - Sonhja
有人能告诉我使用一个带有页面的框架或者一个用户控件会更合适吗?最好附上一个示例。谢谢。 - Theodosius Von Richthofen
2个回答

4

个人而言,我更喜欢使用 <ContentControl /> 作为我的内容区域,并根据用户当前的“窗口”交换活动内容。

我在我的博客上有一个例子供您参考,但基本组件如下:

ViewModel:

ObservableCollection<IViewModel> AvailableScreens;
IViewModel ActiveScreen;

ICommand SetActiveScreenCommand;

有一些像这样的XAML:

<ContentControl Content="{Binding ActiveScreen}" />

我通常使用 DataTemplates 来告诉 WPF 如何绘制每个 ViewModel

<Window.Resources>
    <DataTemplate DataType="{x:Type local:ModulesViewModel}">
        <local:ModulesView />
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:VendorsViewModel}">
        <local:VendorView />
    </DataTemplate>

    <DataTemplate DataType="{x:Type local:EditVendorViewModel}">
        <local:EditVendorView />
    </DataTemplate>
</Window.Resources>

谢谢Rachel,我会尝试这个的。这似乎基本上就是我想要做的。 - Theodosius Von Richthofen
Rachel- 你有什么建议可以让我在每个UserControl的按钮中使用ChangePageCommand?我的情况是,我不能像你博客中的示例一样将按钮放在DockPanel中,我需要在UserControl本身中放置按钮来更改ContentControl的内容。所以,除了具有绑定到DataContext.ChangePageCommand,RelativeSource={RelativeSource AncestoryType={x:Type Window}}}的按钮之外,在每个UserControl中我该怎么做才能调用ChangePageCommand呢? - Theodosius Von Richthofen
如果您无法在ViewModel层中构建命令(例如,您的ParentViewModel设置了ChildViewModel.ChangePageCommand),那么我通常会使用某种消息系统,例如PRISM的EventAggregator或MVVM Light的Messenger。如果您感兴趣,我在我的博客上有一个简要的消息系统概述。基本上,您的主ViewModel将订阅接收ChangePageEvents,并且您可以从程序中的任何位置广播ChangePageEvent - Rachel

0

您可以使用诸如AvalonDock的停靠框架,它模仿了Visual Studio的行为。


无论如何,这个问题是离题的,重点不在于可停靠窗口,他可以使用分隔器、树形视图和上下文编辑器(例如 VS 选项窗口)来实现它。那里没有任何东西是可停靠的... - Adriano Repetti
我在用户体验Stackechange网站上提出了问题,但立刻就被踩了... - Theodosius Von Richthofen
它因为篇幅过长、不清楚实际询问的UX问题而在UX上被downvote。如果你要在多个站点发布,请至少阅读该站点的FAQ以确保你的问题符合该站点的主题,并建议重新格式化你的问题以适应特定的受众,而不仅仅是复制粘贴答案,这样会使答案在多个站点中重复。 - JonW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接