2013-03-12 124 views
2

我做了一个基于用户交互打开连续窗口的WPF应用程序。例如,第一个winodw询问用户想要处理什么模块,当做出选择并按下按钮时,打开一个新窗口,显示一些供应商和摘要计数。选择其中一个供应商并按“编辑”按钮打开另一个窗口,其中显示该供应商的详细信息。点击一个细节,然后点击一个按钮打开另一个窗口,用户可以在其中更改一些数字等。然后用户关闭该窗口,选择不同的项目并编辑,或关闭该窗口并选择不同的供应商等。每个窗口都有自己的窗口目前查看模型。我想摆脱所有的窗口层。选项卡控制似乎不是一个好的选择,因为用户将不得不通过正确的序列等。什么是最好的方法来改变这只使用一个窗口,并换出用户在一个窗口中看到的当他,例如,按下按钮编辑等?转换我的多窗口WPF应用程序到一个窗口?

+1

这是另一个StackExchange网站一个很好的问题:用户体验(http://ux.stackexchange.com/users/13161/ ) – 2013-03-12 14:24:53

+0

这是一个很好的解决方案,使一个主容器,然后浏览您的窗口或不?如果是这样,你可以尝试使用'UserControl',它允许你导航。 – Sonhja 2013-03-12 14:39:58

+0

任何人都可以告诉我,如果一个框架页面或用户控件将是合适的。可能是一个例子?谢谢 – 2013-03-12 14:40:16

回答

3

我个人更喜欢使用<ContentControl />我的内容区域,并根据用户当前的“窗口”

我有an example on my blog你可以看看那个,但基本组成部分看起来像换出活动内容这样的:

视图模型:

ObservableCollection<IViewModel> AvailableScreens; 
IViewModel ActiveScreen; 

ICommand SetActiveScreenCommand; 

有了一些XAML看起来像这样:

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

而且我通常使用DataTemplates告诉WPF如何绘制每个视图模型

<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> 
+0

谢谢蕾切尔我会尝试这个,这似乎基本上是我想要做的 – 2013-03-12 16:03:33

+0

Rachel-你有什么技巧可以让ChangePageCommand可用于每个UserControl中的按钮吗?我的情况是我的DockPanel中的按钮不像您的博客中的示例,我需要在UserCOntrols中拥有按钮才能更改ContentControl的内容。因此,而不是一个绑定到DataContext.ChangePageCommand,RelativeSource = {RelativeSource AncestoryType = {x:Type Window}}}的按钮我可以在每个UserControl中调用ChangePageCommand? – 2013-03-13 12:37:26

+0

@ user1029770如果您无法在ViewModel图层中找到构建命令的方法(例如“ParentViewModel”设置为“ChildViewModel”。ChangePageCommand'),然后我通常使用某种类型的消息系统,如PRISM的'EventAggregator'或MVVM Light的'Messenger'。如果您有兴趣,我可以在我的博客上简要介绍一下[邮件系统概述](http://rachel53461.wordpress.com/2011/06/05/communication-between-viewmodels-with-mvvm/)。基本上你的主ViewModel会订阅接收'ChangePageEvents',你可以从程序中的任何地方广播一个'ChangePageEvent' – Rachel 2013-03-13 12:40:24

0

您可以使用模拟Visual Studio行为的对接框架,如AvalonDock

+0

无论如何,它不是关于可停靠窗口的主题(问题),他可以使用分隔符,树视图和上下文编辑器(例如VS选项窗口)来实现它(例如)。没有什么可以在那里停靠... – 2013-03-12 14:27:07

+0

好的,有没有任何如何做到这一点的例子? – 2013-03-12 14:30:51

+0

我问了那个User Experience stackechange网站上的问题,它立即被投票表决,所以... – 2013-03-12 14:42:39