【问题标题】:Dynamic WPF form creation approaches动态 WPF 表单创建方法
【发布时间】:2016-02-07 14:49:22
【问题描述】:

我即将从 DataTable 数据创建一个动态 WPF UI 表单。屏幕会相当复杂。它们将包含文本框、组框、复选框、按钮、数据网格等。其中一些是可见的,一些连接的事件处理程序和类似的东西。

考虑到性能影响和编写和维护源代码的复杂性要求,您会选择哪种方法来创建这些动态屏幕。请注意,此代码将运行很多,因此它必须高效且快速。我正在考虑以下选项:

  1. 在代码中创建控件,将它们组合成一棵树,并将树(网格控件)用作 WPF 表单的根元素。

1.a) 通过 XAMLReader 从该屏幕对象树创建一个 XAML,并通过 WPF 表单中的 XAMLReader 加载它。创建 XAML 对我来说似乎是多余的,因为我可以直接将构建的树用作 WPF 表单的内容。

  1. 使用 XMLDocument 类创建标签、对象及其属性。创建一个类似的 XAML,然后以 WPF 形式加载该 XAML。

谢谢,

迈克尔

【问题讨论】:

  • DataTable 创建一个动态 UI 听起来非常难以维护。您是否已用尽所有其他选项?您能否就为什么您需要这样做以及这些数据会是什么样子提供更详细的解释?
  • 我的屏幕数据都存储在数据库中(对象名称、父级、屏幕坐标、类型等列)我对此无能为力。我唯一能做的就是将数据转换为其他格式,但首先我需要以 DataTable 的形式处理它。我的问题更多是关于在代码中创建控件还是创建 XAML?

标签: c# wpf performance xaml user-interface


【解决方案1】:

考虑在列表视图中显示您的表单,并为您的每个表单字段文本框、组框、复选框、按钮、数据网格等创建一个 DataTemplate。

<ListBox ItemsSource="{Binding DataFormFields}"

<DataTemplate DataType="YourTextClass">
    <StackPanel>
        <TextBlock Text="{Binding LabelText}" />
        <TextBox Text="{Binding ValueText}" />
    </StackPanel>
</DataTemplate>

<DataTemplate DataType="YourCheckClass">
    <StackPanel>
        <CheckBox Content="{Binding LabelText}" 
                  IsChecked="{Binding Checked}"/>
    </StackPanel>
</DataTemplate>

有关数据模板的更多信息,请参阅 https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/data-templating-overview

每个数据模板都应该与您的表单字段类之一相关联,使用 DataType 属性,这将导致列表框自动使用正确的 DataTemplate。 更多详情:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.datatemplate.datatype?view=netframework-4.7.2

【讨论】:

  • 谢谢蒂姆,我已经根据你的建议修改了这个
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 2011-03-08
  • 2017-01-31
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多