2010-01-10 39 views
1

我正在寫一個自定義控件,它使用我的XAML資源部分中定義的模板,我想在運行時在我的控件實例中替換一個或多個模板部件。例如,如果我在控件的模板中有一個名爲「ActivePart」的零件,那麼如何用一個新的FrameworkElement替換控件實例中的ActivePart的FrameworkElement?如何在運行時在Silverlight 3中替換ControlTemplate部件?

我意識到Control.Template屬性是可寫的,但我更願意找到替換該模板的特定部分的方法,而不是創建一個全新的方法,儘管這是一種通過替換適當的命名部分是可以接受的。

我正在使用C#並需要在運行時使用任何FrameworkElement來做到這一點,所以我不是正在尋找基於XAML的解決方案或建議,謝謝!

P.S.我知道GetTemplateChild()爲控件實例中的命名模板部件返回FrameworkElement,但我看不出如何幫助我用新的FrameworkElement替換該部件。

+0

@Duckboy:請不要使用後腳本註釋。如果你有什麼要添加到你的問題,然後編輯你的問題,並添加到您的問題的主體。 – AnthonyWJones 2010-01-10 21:06:31

+0

@Anthony - 謝謝,完成。 關於問題本身的任何輸入? – Duckboy 2010-01-11 09:53:33

回答

1

我想我錯過了顯而易見的! OnApplyTemplate叫上你的派生控制,VisualTreeHelper.GetChild

後(此,0)將返回實例化模板的可視化樹的根對象,從中你可以使用兒童集合(如果你控制的模板面板 - 如,畫布,網格等),以添加/刪除/修改任何兒童模板部分到您的心臟的內容。

OnApplyTemplate被調用之前,沒有視覺樹存在的控制,並且VisualTreeHelper.GetChildrenCount返回0