如何在Silverlight 3中在运行时替换ControlTemplate部件?

时间:2010-01-10 11:49:04

标签: silverlight silverlight-3.0 controltemplate

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

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

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

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

P.S。我知道GetTemplateChild()为控件实例中的命名模板部件返回FrameworkElement,但是我没有看到这有助于我用新的FrameworkElement替换该部分。

1 个答案:

答案 0 :(得分:1)

我想我错过了显而易见的事情!

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

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