[英]Where does the look of wpf come from?
我剛讀過Thomas Claudius Huber關於WPF的書。 他表示,所有WPF控件都是“不露面”的。 他們只是從他們的ControlTemplate
獲取他們的外觀(和可視化樹)。 這提出了一個問題: WPF的外觀來自哪里?
我的意思是: Button
有一個帶有一些Border
s和一個ContentPresenter
的ControlTemplate
。 這兩個( Border
和ContentPresenter
)從哪里看?
我已經用Google搜索並發現, Border
是一個Decorator
並在OnRender
-Method中設置它的外觀。
那是底線嗎? 沒有ControlTemplate的所有其他元素是否在OnRender
-Method中定義了它們的外觀?
簡短回答: 是的 。 所有不是控件且具有“外觀”的視覺元素,在其UIElement.OnRender
方法覆蓋中定義所述外觀。
答案很長: 控件不使用OnRender
方法來定義它們的外觀。 相反,他們的“外觀”在樣式和模板中定義。 如果在應用程序中沒有顯式定義樣式或模板,WPF控件只需使用當前系統主題中的默認樣式和模板(有關主題的更多信息,請查看此MSDN文章 )。
我們只是說框架有自己的資源字典,其中包含所有內置控件的默認樣式。 例如,這是ComboBox的默認ControlTemplate: ComboBox樣式和模板
話雖這么說,有幾個可視組件通過代碼定義其外觀,通常通過OnRender
覆蓋。 他們不是控制; 他們是裝飾者 , 形狀和類似的東西。 具有“外觀”的東西:邊框,矩形等。但最后,由於所有ControlTemplates都由這些元素或其他控件組成,因此所有控件都具有這些元素。
TextBlock ,作為Run , FlowDocument和其他類似元素,是專門為文本渲染創建的特殊元素。 除了專注於文本而不是圖形之外,它們屬於與形狀或裝飾器類似的類別。 例如,TextBlock不是Control,並在其OnRender
方法上定義其外觀。 另一方面,標簽是一個控制; 但是如果你檢查它的模板,你會看到它最終使用TextBlock來顯示文本。
還有其他元素(如ContentPresenter , ItemsPresenter )沒有任何外觀,不是隱式的,不是默認情況下,不是樣式或模板。 這些是邏輯元素,用於定義視圖的結構。 例如,ContentPresenter獲取ContentControl的Content
和ContentTemplate
屬性,並確保所述模板正確呈現並綁定到所述數據,可以這么說。 但他們沒有自己的視覺表現。
哦,我幾乎忘記了Panels 。 面板也不是控件,它們確實有自己的外觀。 但與Presenters類似,它們也是定義其他視覺元素如何可視化的邏輯元素。 更具體地說,他們的布局。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.