如何获取DataTemplate的逻辑树

时间:2010-07-13 05:38:51

标签: wpf

是否有可能访问DataTemplate的逻辑树

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

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

请注意,我不想访问使用此DataTemplate的itemscontrol 的可视树。我想访问DataTemplate本身的树。

1 个答案:

答案 0 :(得分:2)

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

<强>更新

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

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

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

稍微测试表明,当您从XAML加载模板时,VisualTree属性为null,模板的实际内容存储在其他位置,此“其他”是TemplateContent对象,并且此对象没有您可以使用的公共成员。

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

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