在代碼中,一個ControlTemplate
包含一個層次結構FrameworkElementFactory
,可用於構建框架元素本身。但是,在XAML中,ControlTemplate
的內容顯示爲元素本身。如何在XAML中實例化ControlTemplate?
XAML解析器是否從一個對象形式轉換爲另一個對象形式,是否使用ValueConverter
,還是它在解析ControlTemplate
內容時實際創建工廠?
在代碼中,一個ControlTemplate
包含一個層次結構FrameworkElementFactory
,可用於構建框架元素本身。但是,在XAML中,ControlTemplate
的內容顯示爲元素本身。如何在XAML中實例化ControlTemplate?
XAML解析器是否從一個對象形式轉換爲另一個對象形式,是否使用ValueConverter
,還是它在解析ControlTemplate
內容時實際創建工廠?
實際上,如果它是在XAML中定義的而不是在代碼中定義的,那麼實際上的做法會有所不同。爲了驗證,您可以使用單個窗口在WPF中創建一個簡單項目,並添加一個自定義Control,該控件具有在XAML中定義的ControlTemplate,默認Style。然後將控件添加到窗口並添加一個Button,其Click處理程序包含一個斷點。
當斷點被擊中時,我們可以檢查自定義控件,它是ControlTemplate。 VisualTree屬性(即FrameworkElementFactory)爲null。
使用Reflector,我們可以在StyleHelper.ApplyTemplateContent方法中看到相關的代碼。該方法中的第一個if語句應用FrameworkElementFactory(從VisualTreeProperty傳入)。第二個if語句從XAML加載ControlTemplate,最終執行FrameworkTEmplate.LoadOptimizedTemplateContent。
很好的解釋。謝謝。 – mancaus 2011-03-04 18:59:39