【问题标题】:Converting my multi window WPF app to one window?将我的多窗口 WPF 应用程序转换为一个窗口?
【发布时间】:2013-02-28 02:56:21
【问题描述】:

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

【问题讨论】:

  • 这是另一个 StackExchange 站点的好问题:User Experience
  • 创建一个主容器然后在窗口中导航是否是一个好的解决方案?如果是这样,您可以尝试使用UserControl,它可以让您导航。
  • 谁能告诉我带有页面的框架或用户控件是否合适。可能是一个例子?谢谢

标签: c# wpf window


【解决方案1】:

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

我有an example on my blog,你可以看看,但基本组件如下所示:

视图模型:

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 我会试试这个,这似乎基本上是我想做的事
  • Rachel- 关于如何使 ChangePageCommand 可用于我的每个用户控件中的按钮,您有什么建议吗?我的情况是,我不能像您博客上的示例那样在 DockPanel 中有按钮,我需要在 UserCONtrols 本身中有按钮来更改 ContentControl 的内容。因此,除了绑定到 DataContext.ChangePageCommand 的按钮,RelativeSource={RelativeSource AncestoryType={x:Type Window}}} 我可以在每个 UserControl 中做什么来调用 ChangePageCommand?
  • @user1029770 如果您找不到在 ViewModel 层中构建命令的方法(例如您的 ParentViewModel 设置 ChildViewModel.ChangePageCommand),那么我通常使用某种消息传递系统,例如 PRISM 的EventAggregator 或 MVVM Light 的 Messenger。如果您有兴趣,我的博客上有一个简短的overview of messaging systems。基本上,您的主 ViewModel 将订阅接收 ChangePageEvents,您可以从程序中的任何位置广播 ChangePageEvent
【解决方案2】:

您可以使用类似 Visual Studio 行为的停靠框架,例如 AvalonDock

【讨论】:

  • 这是题外话(问题)无论如何重点不是关于可停靠窗口,他可以(例如)使用拆分器、树视图和上下文编辑器(如 VS 选项窗口,例如)。那里没有可停靠的东西......
  • 我在那个用户体验 stackechange 网站上问了这个问题,它立即被否决了,所以......
  • 它在 UX 上被否决了,因为它是一堵巨大的文字墙,而且不清楚您实际要求的 UX 问题是什么。如果您要在多个网站上发帖,请在发布问题之前至少阅读这些网站的常见问题解答,以确保您的问题在此处与主题相关,并且还建议您重新格式化您的问题以迎合特定网站的受众,而不是只需复制并粘贴答案,以便在多个站点上复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
相关资源
最近更新 更多