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

Wpf 如何更改可视化树中xaml中的元素,wpf,Wpf,我对WPF和tyring不太熟悉,因此无法理解修改任何给定控件属性的最佳方式。我试图实现的是显示单元格的工具提示。是的,一个快速的谷歌,可以看到如何做到这一点的xaml。但我想了解的是,一个人怎样才能学会使用某种工具来解决这个问题。 我遇到了Snoop,它可以很容易地显示控件的可视树(CTRL+SHIFT)。我想了解的是,如果一个人知道视觉树,他怎么能改变它?例如,假设我使用WPF DataGrid并使用DataGridTextColumn将其绑定到源和显示列 <DataGridTextC

我对WPF和tyring不太熟悉,因此无法理解修改任何给定控件属性的最佳方式。我试图实现的是显示单元格的工具提示。是的,一个快速的谷歌,可以看到如何做到这一点的xaml。但我想了解的是,一个人怎样才能学会使用某种工具来解决这个问题。 我遇到了Snoop,它可以很容易地显示控件的可视树(CTRL+SHIFT)。我想了解的是,如果一个人知道视觉树,他怎么能改变它?例如,假设我使用WPF DataGrid并使用DataGridTextColumn将其绑定到源和显示列

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

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

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


谢谢

你在这里问了不少问题,我不确定我是否完全理解你的意图,所以我希望我没有弄错。您的问题是是否可以访问每个控件的完整视觉表示,并使用xaml对其进行更改。答案是肯定的,但你不应该

我稍后会讲到我的意思,但首先我想澄清一些概念,因为我不确定您是否正确使用了它们

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


默认属性值

  • 逻辑树
    是xaml代码的运行时表示形式。它(主要)由您在xaml文件中设置的控件组成

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

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

这就是为什么你不应该访问它。xaml表示通常为您提供修改控件所需的一切,即使您确实使用了模板,也不应该更改控件的每一部分。模板用于设置控件的样式,因此只需编写足够的模板即可显示它。没有必要详细说明一切


但是,如果您使用(顺便说一句,snoop就是这样做的),那么您可以使用过程代码更轻松地访问整个可视树。使用它,您可以遍历可视化树并访问它的所有类和成员。如果你真的想访问每一个可视对象,你可以使用VisualTreeHelper更轻松地访问它。

你的问题太抽象了……你能用更具体的方式来回答吗?
<ClassA PropertyA="Value">
  <ClassA.PropertyB>
    <ClassB />
  </ClassA.PropertyB>
  Default property value
</ClassA>