Wpf 在ControlTemplate中扩展子元素

Wpf 在ControlTemplate中扩展子元素,wpf,dependency-properties,controltemplate,expander,Wpf,Dependency Properties,Controltemplate,Expander,我正试图扩展一个标题的部分,以允许更多的自定义功能。作为使用ControlTemplates扩展WPF控件的新手,我现在已经接受了,我必须完全用自己的模板替换扩展器的模板,而不能重用最初定义的组件,甚至样式,这让我觉得这有点烦人——但这不是问题所在 但是,我想介绍一些属性,它们可以改变组件的外观和工作方式。所以我创建了一个新的Expander子类型,它简单地定义了我想要使用的新依赖属性。但是我注意到,如果我想在ToggleButton的模板中使用这些属性,而ToggleButton嵌套在Expa

我正试图扩展一个标题的部分,以允许更多的自定义功能。作为使用ControlTemplates扩展WPF控件的新手,我现在已经接受了,我必须完全用自己的模板替换扩展器的模板,而不能重用最初定义的组件,甚至样式,这让我觉得这有点烦人——但这不是问题所在

但是,我想介绍一些属性,它们可以改变组件的外观和工作方式。所以我创建了一个新的Expander子类型,它简单地定义了我想要使用的新依赖属性。但是我注意到,如果我想在ToggleButton的模板中使用这些属性,而ToggleButton嵌套在Expander的模板中,我就不能这样使用这些属性。因此,我还必须为ToggleButton子类型,定义该类型的依赖属性,并使扩展器的模板将值传递给ToggleButton模板

因此,我在名称空间中创建了两个新类型,将新的ToggleButton类型嵌套在Expander子类型中“不起作用”?,这是Expander模板的完整副本,在插入ToggleButton的位置只更改了一行,并通过新属性,然后是ToggleButton模板的实际所需更改

问题来了:有没有办法让事情变得不那么复杂?为了减少扩展另一个模板的子组件所需的工作量?或者只是在ToggleButton模板中使用父级的Expander属性,而不必对该模板进行子类型划分?

我最终使用了jberger在评论中建议的方法:

使用以下绑定表达式,我不需要将DependencyProperties复制到ToggleButton的另一个组件中,只需访问嵌套模板中的扩展器属性即可:

{Binding CustomProperty, RelativeSource={RelativeSource
    FindAncestor, AncestorType=local:CustomExpander}}
遗憾的是,正如预期的那样,显然不能重用默认的模板部分。然而,在这种情况下,我可以省略原始模板中我在副本中不需要的部分。例如,非默认展开的不同样式,即顶部以外的样式,因为“我的扩展器”专用于该布局


然而,这使得ExpandDirection属性毫无用处,但我个人可以接受这一点。但这可能会导致后续问题;如果您更愿意基于扩展器的基础而不是扩展器本身从头开始构建组件。

是否可以使用Binding ElementName和/或RelativeSource来访问父属性?@jberger它确实可以使用{Binding CustomProperty,RelativeSource={RelativeSource FindAncestor,AncestorType=local:CustomExpander},谢谢你!然而,整个过程仍然有些复杂,所以我欢迎任何进一步的建议。那么,既然您可以使用绑定,您还需要解决哪些问题?您是否可以提供有关以下方面的详细信息:更改组件的外观和工作方式。我在标题中添加了一些附加控件,例如第二个ContentPresenter。因为我只是编辑标题的模板,所以我觉得保留整个扩展模板的副本是非常多余的,尽管我只对220行中的30行感兴趣。