为基于架构的 XML 文件创建 WPF 编辑器

2024-05-10

这是场景。我们的服务器产品之一使用大型 XML 配置文件。该文件的布局相当好,并且针对 XSD 文件进行了验证。

现在是时候构建一个配置 GUI 来维护这个文件了,我想深入研究 WPF 来完成它。我可以为每个配置部分布置一个单独的表单,每次向配置文件添加选项时都进行重构和重新分发,但我希望有一种更聪明的方法来做到这一点。

由于我已经有了强类型的 xml/xsd 组合,我希望有一种优雅的方法来构建 UI 来足够轻松地编辑它。我知道我可以编写 xml->xaml 转换,但希望已经有一些东西可以为我完成繁重的工作?

提前致谢..


我会怎么做:

我首先构建一个简单的视图模型类,它包含XmlElement并将其公开为配置选项。这门课可以是极其简单,例如:

public class OptionView
{
   private XmlElement XmlElement;
   public OptionView(XmlElement xmlElement)
   {
      XmlElement = xmlElement;
   }
   public string Name { get { return XmlElement.Name; } }
   public string Value 
   { 
      get { return XmlElement.InnerText; } 
      set { XmlElement.InnerText = value; }
   }
}

现在我可以填充一个集合ElementView对象来自XmlDocument,将该集合添加到窗口的ResourceDictionary,并使用简单的方法格式化对象DataTemplate, e.g.:

<DataTemplate x:Key="OptionViewTemplate" DataType={x:Type local:OptionView}>
   <Grid>
       <Grid.ColumnDefinitions>
          <ColumnDefinition SharedSizeGroup="Name"/>
          <ColumnDefinition SharedSizeGroup="Value"/>
       </Grid.ColumnDefinitions>
       <Label Content="{Binding Name}" Grid.Column="0"/>
       <TextBox Text="{Binding Value}" Grid.Column="1"/>
   </Grid>
</DataTemplate>
...
<ItemsControl Grid.IsSharedSizeScope="True"
    ItemsSource="{DynamicResource OptionCollection}"/>

(注意:稍后,您可以花哨并定义子类OptionView例如,基于底层的数据类型XmlElement。然后你可以定义DataTemplates 对于每个子类,并且只要每个子类都使用该子类在两列网格中呈现该项目SharedSizeGroup,第二列可以包含日期选择器、单选按钮或任何适合子类的内容,并且它们都会在运行时整齐地布局。)

一旦我开始工作(这不会花很长时间),我就会开始扩展OptionView班级。例如,如果您的架构正在为某个元素存储人类可读的标签xs:annotation元素(如果不是,为什么不呢?),我会做Name属性从中提取XmlElement's SchemaInfo属性,而不是暴露底层元素名称。

显然我想添加验证,所以我添加一个验证方法来检查XmlElement's SchemaInfo属性并对其进行解释。 (假设您要验证的元素是简单的内容,那应该不难。)关于如何在 WPF 应用程序中实现验证的教程有一百万个,因此我不会在这里过多介绍。

如果有大量的配置选项,并且您有一些智能的方法将它们分组,我会构建一个更高级别的类,它公开(至少)两个属性 - 一个字符串CategoryName财产和OptionsViews集合 - 从 XML 文档填充它,并将其添加到窗口的ResourceDictionary。在窗口内,我将它绑定到TabControl, e.g.:

<TabControl ItemsSource="{DynamicResource OptionCategories}">
   <TabControl.ItemContainerStyle>
      <Style TargetType="{x:Type CategoryView}">
         <Setter Property="Header" Value="{Binding Path=CategoryName}"/>
         <Setter Property="Content" Value="{Binding Path=OptionsViews}"/>
         <Setter Property="ContentTemplate" Value="{StaticResource OptionViewTemplate}"/>
      </Style>
   </TabControl.ItemContainerStyle>
</TabControl>

或者某些项目控件的项目容器模板创建了一个Expander。或者其他的东西。 (所有代码都保证未经测试!不过,其中大部分都是从工作项目中复制出来的。)

如果您以前没有使用过 WPF,那么这是一个非常好的项目。它将向您展示数据绑定以及项目控制和验证的基础知识,最终结果将是有用的并且可能看起来相当不错。

您会注意到,虽然创建模板所涉及的标记非常冗长,但只有两个模板。应用程序中的唯一代码(到目前为止)是公开的代码XmlElement到 UI。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为基于架构的 XML 文件创建 WPF 编辑器 的相关文章

随机推荐