如何更改可视树中xaml中的元素

时间:2014-04-30 19:49:38

标签: wpf

我是WPF和tyring的新手,了解我可以修改任何给定控件属性的最佳方法。我想要实现的是显示一个单元格的工具提示。是的快速谷歌,可以看到如何做到这一点的xaml。但我想知道如何使用某种工具学会解决这个问题。 我遇到了Snoop,可以很容易地显示控件的可视树(CTRL + SHIFT鼠标悬停)。我想要了解的是,如果有人知道视觉树,怎么能改变它呢?例如,假设我使用WPF DataGrid并使用DataGridTextColumn将其绑定到源和显示列。

<DataGridTextColumn Header="First Name" Binding="{Binding FirstName}">

现在假设我想显示每个单元格的工具提示。所以我在单元格上启动了Snoop和CTRL + SHIFT鼠标。 Snoop告诉我它是一个DataGridCell,它正在使用Border并使用它的ContentPresenter,它最终使用TextBlock来显示值。这意味着如果我能以某种方式访问​​该文本块,我可以使用绑定设置其tooltip属性。问题是我不知道如何在xaml中访问它。

换句话说,知道一个可视树,如何在xaml中为任何给定的控件访问它。对于第三方控件,这也非常方便。

由于

1 个答案:

答案 0 :(得分:0)

你在这里问了很多,我不确定我是否完全理解你的意图,所以我希望我能做到这一点。您询问是否可以访问每个控件的完整可视化表示并使用xaml进行更改。答案是肯定的,但你不应该这样做。

我会稍微谈谈我的意思,但首先我要澄清一些概念,因为我不确定你是否正确使用它们。

  • XAML:
    Xaml是您的视图的声明性标记表示,仅此而已。 Xaml语法直接对应于它的各自classes和它们的properties。 Xaml将标记映射到类,将属性映射到属性。这是一个小小的区别,但这样思考是很重要的。您可以在xaml中执行的所有操作都可以在代码中完成(尽管通常会有更多工作)。同样:xaml仅指标记代码。

<ClassA PropertyA="Value">
  <ClassA.PropertyB>
    <ClassB />
  </ClassA.PropertyB>
  Default property value
</ClassA>

  • 逻辑树
    logical tree是xaml代码的运行时表示。它(大部分)包含您在xaml文件中设置的控件。

  • 可视树
    visual tree是逻辑树的可视化表示。它包含更多内容,因为它包含视图中显示的所有内容的具体视觉表示。大多数逻辑树无法直接显示。 WPF使用DataControl Templates以及Styles来确定每个对象的外观。如果数据模板也可能意味着简单的数据对象,而不仅仅是WPF控件。

现在提出您的问题:您可以访问每个控件的具体视觉表示吗?
,但您必须使用控制模板来操纵它的视觉效果。此外,控件模板通常应用于控件类型而不是特定控件,因此您也必须处理它。

这就是不应该访问它的原因。 xaml表示通常为您提供修改控件所需的一切,即使您使用模板,也不应该更改它的每一个。模板用于设置控件的样式,因此只需编写足够的内容即可根据需要显示控件。没有必要指明一切。

然而如果您使用VisualTreeHelper class(顺便说一句,这就是窥探的方式),您可以使用程序代码更轻松地访问整个可视化树。使用它,您可以遍历可视树并访问其所有类和成员。如果您真的想要访问每个可视对象,那么使用VisualTreeHelper可以更轻松地完成它。