【发布时间】:2016-12-13 21:27:49
【问题描述】:
我们目前有一个可配置 UI 的基本实现,但我们觉得这不是最好的方法。我们正在开发另一个需要从外部文件进行配置的应用程序,我们想知道是否有更好的方法来做到这一点。
我们目前有带有名称和可用性元素的 xml 文件,这些元素直接转换为可见性。当元素为available="false" 时,我们使用visibility="collapsed" 隐藏元素。元素包含在带有名称的 Setup 元素中。我们要加载具有安装名称的单独配置文件。
<Setup name="All">
<Element name="toolBarDrawingTools" available="true"/>
...
</setup>
<Setup name="Operator">
<Element name="toolBarDrawingTools" available="false"/>
...
</setup>
它工作得相当好,但我们觉得这不是一个很好的方法来隐藏元素。更好的方法可能是只创建和添加我们需要的元素。布局应该不是什么大问题,因为大多数元素都是 ToolBars、MenuItems 或 UserControls,它们将被添加到 StackPanels。所以没有复杂的元素定位。我们还发现使用 XAML 代码定义 xml 文件,并在运行时将其转换为可视元素。我们不需要那么复杂。我们有一组要动态添加的 UserControl。
我们没有一个清晰的愿景,我们想要什么。最后,我们可以使用我们目前的方法,它会奏效。我们需要的是从外部源定义最终窗口中的元素,而不需要重新编译整个应用程序。
所以我要问的是我们有哪些选择,是否有任何“标准化”的方式或框架。你知道关于这个主题的任何文章或书籍吗?还是我们应该坚持最简单的方法,只隐藏我们不想要的东西?
谢谢
【问题讨论】:
-
在我的 WPF 项目中,我使用了 Prism + Regions,每个模块都可以添加一些 UI 部分。如果你不想展示一些功能,你不应该加载模块。
-
“我们觉得仅仅隐藏元素并不是一个好方法”:如果没有具体的性能问题,请不要担心。但是“正确”的 MVVM 解决方案是将您的模块实现为视图模型,这将是主视图模型的属性(或者它们位于主 vm 拥有的集合中)。主视图以
ContentControls 或ItemsControl显示它们,每个模块都有一个隐含的DataTemplate。如果模块MainVM.Foo被隐藏,则意味着MainVM.Foo返回null。或者您将其从ObservableCollection<VMBase> MainVM.ChildCollections中删除。
标签: c# wpf user-interface