1

我正在编写一个自定义控件,它使用在我的 XAML 的资源部分中定义的模板,并且我想在运行时替换我的控件实例中的一个或多个模板部分。

例如,如果我在控件的模板中有一个名为“ActivePart”的部件,如何将控件实例中的 ActivePart 的 FrameworkElement 替换为新的 FrameworkElement?

我意识到 Control.Template 属性是可写的,但我更愿意找到一种方法来替换该模板的特定部分而不是创建一个全新的部分,尽管通过替换适当的命名部分来编辑现有模板的解决方案会可以接受。

我正在使用 C#,需要在运行时使用任何 FrameworkElement 执行此操作,因此我不是在寻找基于 XAML 的解决方案或建议,谢谢!

PS 我知道 GetTemplateChild() 返回控件实例中命名模板部分的 FrameworkElement,但我不明白这如何帮助我用新的 FrameworkElement 替换该部分。

4

1 回答 1

1

我想我错过了明显的!

您的派生控件上调用 OnApplyTemplate 后,VisualTreeHelper.GetChild (this, 0) 将返回实例化模板的可视化树的根对象,您可以从中使用 Children 集合(如果您的控件的模板是面板派生的,例如 Canvas, Grid 等)来添加/删除/修改任何子模板部分到您的心脏内容。

在调用 OnApplyTemplate 之前,控件不存在可视化树,VisualTreeHelper.GetChildrenCount 返回 0。

于 2010-01-11T10:37:38.980 回答