WPF:UI组合

时间:2009-09-11 12:08:03

标签: c# wpf user-interface

我正在开发一个WPF应用程序,UI管理起来有点复杂。我正在寻找有关如何保持它增长的建议。

布局看起来像这样

<Grid>
   <List of Objects View/>
   <Objects Relationship View/>
   <Object Details View />
   <Multiple Objects Details View/>
   <View 5 />
   <View 6 />
     :
     :
</Grid>

构建窗口时,每个视图都会被创建(隐藏可见性)并绑定到某些复杂数据。我想一次只向用户显示一个视图。我通过操纵可见性来做到这一点。

但问题是视图之间的转换不涉及仅仅擦除可见性。它涉及使用currentdata重新绑定,停止后台线程/定时器以及启动支持新选择视图的新线程(可能还有一些绑定)。所以正在发生的事情是我添加的每个新视图,我添加了一大堆代码来处理所有可能的转换。

我是否可以使用某种模式来处理这种情况?

还有一些方法可以避免在应用程序加载时创建和隐藏所有内容并使用visibilty作为控制器吗?

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

请问您是如何允许用户在视图之间来回切换的?这是一个关键的组合吗?鼠标点击?

并不是说它本身就回答了你的问题,但我的建议是,这听起来像是一个标签控件的完美场景。使用WPF,它不一定要像标签控件那样。

如果使用TabControl,则可以使用TabControl中的SelectionChanged事件来允许您告知后台线程停止,并且可以卸载需要卸载的任何内容。

根据您使用TabControl的方式,可以在某种程度上虚拟化UI。这意味着每当选项卡被取消选中时,该选项卡的所有UI都将被销毁,并在下次选中时重新创建。如果您使用MVVM或PresentationModel模式并将ViewModel作为TabControl的项加载并使用DataTemplates作为视图,它将以这种方式运行。如果你只是将TabItems放入带有控件的TabControl中,它就不会这样做。

就模式而言,我肯定会推荐MVVM。赶上它并理解它可能需要一些时间,但如果没有它,我永远不会做WPF。如果您需要更多资源或示例,请与我们联系。

修改

我重读了您的问题并注意到您可能需要其他类型的导航。如果您有需要根据用户操作转换到其他视图的视图,并且您不希望将所有视图呈现给用户,以便他们可以选择他们想要查看的视图(例如TabControl会这样做,你可能想看看WPF Navigation。导航基本上是MS在WPF中添加的内容,以允许在WPF应用程序中进行浏览器样式导航。 This MSDN article应该是这类事情的好资源。

答案 1 :(得分:1)

这听起来像是一个非常适合复合WPF(Prism)的问题。您可以将主区域定义为区域,并使用SingleActiveRegion一次显示一个视图。如果您创建自己的区域适配器,则可以在活动视图更改时执行所有维护。

此外,添加新视图不会涉及更改主机视图的代码。这将允许您将来在单独的程序集中部署其他视图...