wpf - 如何获取 DataTemplate 的逻辑树

标签 wpf

有没有可能访问 DataTemplate 的逻辑树 .

<DataTemplate x:Key="Test_DataTemplate">
    <Grid >        
        <TextBlock>Test</TextBlock>        
    </Grid>            
</DataTemplate>

对于上面的示例,如果我通过 FindResource("Test_DataTemplate") 获得 DataTemplate ,然后是否可以访问树,例如获取 TextBlock 控件。

请注意,我不想访问项目控件的可视化树 使用此 DataTemplate。我想访问 DataTemplate 本身的树。

最佳答案

DataTemplate 有一个 VisualTree 属性,可让您在应用模板时访问用于创建对象的工厂对象,您无法访问示例中的实际 TextBox,因为在应用模板之前它不存在。

更新:

当您使用 VisualTree 属性在代码中构建 DataTemplate 时,VisualTree 属性保存使用模板时构建可视化树所需的数据。

VisualTree 属性不引用模板的实际可视树(由 VisualTreeHelper 访问),因为模板没有实际的可视树 - 只有构建所需的信息。

顺便说一下,为了让事情更有趣一点,数据模板的 VisualTree 属性的内容更接近于逻辑树而不是视觉树。

一个小测试表明,当您从 XAML 加载模板时,VisualTree 属性为空并且模板的实际内容存储在其他地方,这个“其他地方”是一个 TemplateContent 对象,并且该对象没有您可以使用的公共(public)成员。

因此,为了访问在 XAML 中定义的模板的内容,您必须使用模板的 LoadContent 方法来实际创建模板中定义的对象,然后使用 VisualTreeHelper 或 LogicalTreeHelper 来探索创建的对象。

(您可以使用反射来查看 TemplateContent 对象 - 但这意味着您依赖于您不完全理解并且可以在版本之间更改的未记录的内部实现细节 - 所以我不推荐它)

关于wpf - 如何获取 DataTemplate 的逻辑树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3234462/

相关文章:

c# - 使用 Process.Start 启动 WPF 应用程序

c# - 在 Caliburn.Micro 中如何将操作绑定(bind)到嵌套的 ViewModel 方法?

c# - 更改 FormattedText 的文本

wpf - 如何在设计时制作支持拖放的自定义 WPF ContentControl?

c# - 调试加载的 FontFamily?

c# - 重新绑定(bind)新数据源时 DataGrid 不更新

c# - 检测弹出窗口何时/是否决定重新定位自身

c# - 读取 WPF gridview 中的每个单元格值

.net - future 的(Windows)桌面应用开发 : the future of WPF and Silverlight

c# - 更改 DataGrid 列标题文本