好的...这里有点像两部分。(有点。实际上可能只是一个。这就是我所希望的。)
首先,更一般地说,是否可以仅通过 XAML 定位控件模板中的命名项?例如,如果一个控件的模板有一个名为“PART_Foo”的 ContentPresenter,并且我们想通过纯样式专门将该特定项目上的 HorizontalAlignment 设置为“Stretch”,可以做到吗?我知道我们可以在子类的 OnApplyTemplate 覆盖中执行此操作,在该子类中我们通过名称显式搜索控件,然后在代码中设置属性,但同样,我们希望有一个仅限 XAML 的解决方案,因此我们可以通过样式严格执行此操作而不是子类,除了特定的用例场景外,大多数情况下都不鼓励使用子类。
此外,我们不希望手动指定控件的模板,因为我们希望当前主题确定该模板是什么以及控件的显示方式。我们只想说'在主题选择的任何模板中,如果有一个名为'foo'的部分,请通过纯样式在其上设置此属性。如果找不到具有该名称的零件,则什么也不做!
对仅 XAML 方法的渴望更多是因为第二部分,即我们针对的是生成的容器对象,而不是控件本身,这意味着它无论如何都不会是一个直接的子类,因为我们不得不四处乱逛使用 ItemcontainerGenerators 等,这在 a$$ 中是一个真正的痛苦,尤其是当 ItemsControl 被虚拟化时。
具体来说,我们的最终目标是在 TreeView 的 TreeViewItem 模板中挑出名为“Bd”的边框,并将其附加属性“Grid.ColumnSpan”设置为“2”,而不是默认的“1”。而已!令我惊讶的是,如果不手动替换整个 TreeViewItem 的模板或诉诸基于代码隐藏的解决方案,那么如此简单的事情似乎几乎是不可能的。