【问题标题】:WPF: How to create the visual tree for dynamically generated DataGrid objects?WPF:如何为动态生成的 DataGrid 对象创建可视化树?
【发布时间】:2013-07-11 17:01:39
【问题描述】:

如果我在代码后面创建一个DataGrid 并添加一些任意列,我无法为DataGrid 创建可视化树。我需要动态编辑特定行的CellStyle 属性,因此我希望能够在运行时对我的DataGrid 对象使用VisualTreeHelper 函数。如何为动态创建的DataGrid 对象构建可视化树?如果我在设计时使用 XAML 构建树,则树的构建没有问题,但我不确定如何针对动态案例执行此操作。

我的问题的一个简单的示例是这样的:

    <Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
        <Grid Name="MainGrid" />
    </Window>

后面的代码为:

    Class MainWindow
        Dim dg As DataGrid
        Dim col As DataGridTextColumn

        Sub New()
            InitializeComponent()

            col.Header = "HEAD0RR"
            dg.Columns.Add(col)
            MainGrid.Children.Add(dg)
        End Sub
    End Class

但是 WPF Tree Visualizer 只是将我创建的 DataGrid 显示为没有父级或子级,因此 VisualTreeHelper 函数不起作用。

【问题讨论】:

  • 如果您需要动态创建列,请尝试覆盖 ArrangeOverride,如果您需要做的只是更改您可能会覆盖 OnRowLoaded 的样式
  • 我只想添加一个简单的技巧,而不是像建议的那样接受答案或覆盖 OnRowLoaded 就是调用元素的 focus() 方法以强制构建可视化树。

标签: wpf vb.net datagrid datagridcell


【解决方案1】:

如果我使用 XAML 在 设计时,但我不确定如何为动态案例执行此操作。

首先,“XAML”和“动态”不是相互排斥的。您确定需要通过程序 (VB) 代码构建网格并访问 CellStyles 吗? XAML 中有多个选项比显式扫描可视化树更容易、更易于维护和更动态。例如:

至于为什么在可视化树中看不到项目:您何时尝试访问它?它不会立即填充。您可能需要等待Loaded 事件,或者DataGrid 的ItemContainerGeneratorStatusChanged 事件。

【讨论】:

  • 我正在设计的表单需要创建一个新的数据网格以响应用户输入;我在一个 tabcontrol 中执行此操作,它添加了一个包含新生成的数据网格的新 tabitem。这种行为对于我正在开发的应用程序是必要的,我不确定在 XAML 中执行此操作的方法。我试图在应用程序逻辑中创建数据网格的子元素后访问它,以更改在新数据网格对象中生成的特定行的单元格样式属性。
  • 我假设“特定行”由它们显示的数据类型标识,因此您应该能够使用 DataTriggers 定义样式差异。如果您需要动态生成列,您仍然可以使用 XAML 中的 DataTriggers 定义实际样式,并执行类似col.CellStyle = FindResource("SpecialCellStyle") 之类的操作,其中“SpecialCellStyle”是您的 XAML 资源的x:Key
  • 你能给我指出一个资源来帮助我弄清楚如何使用 XAML 来允许创建新的数据网格对象并按照我需要的方式进行格式化,这样我就不必在后面的代码中进行操作了?我创建并添加到 tabitem 的内容也遇到了类似的问题,该 tabitem 被添加到我用作 tabcontrol 的 itemsource 的 tablist 中;我在 tabitem 中创建的任何内容(包括 tabitem)都不会生成可视化树,供我用来操作子对象或父对象。
  • 嗯,有一个非常全面的关于 ItemsControls 的系列(DataGrid 就是其中之一)here。基本上你应该熟悉 DataTemplates(我在上面链接过)——它们通常消除了手动插入元素和处理可视化树的需要。
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 2010-12-31
  • 2012-04-24
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多