簡體   English   中英

wpf的外觀來自哪里?

[英]Where does the look of wpf come from?

我剛讀過Thomas Claudius Huber關於WPF的書。 他表示,所有WPF控件都是“不露面”的。 他們只是從他們的ControlTemplate獲取他們的外觀(和可視化樹)。 這提出了一個問題: WPF的外觀來自哪里?

我的意思是: Button有一個帶有一些Border s和一個ContentPresenterControlTemplate 這兩個( BorderContentPresenter )從哪里看?

我已經用Google搜索並發現, Border是一個Decorator並在OnRender -Method中設置它的外觀。

那是底線嗎? 沒有ControlTemplate的所有其他元素是否在OnRender -Method中定義了它們的外觀?

簡短回答: 是的 所有不是控件且具有“外觀”的視覺元素,在其UIElement.OnRender方法覆蓋中定義所述外觀。

答案很長: 控件不使用OnRender方法來定義它們的外觀。 相反,他們的“外觀”在樣式和模板中定義。 如果在應用程序中沒有顯式定義樣式或模板,WPF控件只需使用當前系統主題中的默認樣式和模板(有關主題的更多信息,請查看此MSDN文章 )。

我們只是說框架有自己的資源字典,其中包含所有內置控件的默認樣式。 例如,這是ComboBox的默認ControlTemplate: ComboBox樣式和模板

話雖這么說,有幾個可視組件通過代碼定義其外觀,通常通過OnRender覆蓋。 他們不是控制; 他們是裝飾者形狀和類似的東西。 具有“外觀”的東西:邊框,矩形等。但最后,由於所有ControlTemplates都由這些元素或其他控件組成,因此所有控件都具有這些元素。

TextBlock ,作為RunFlowDocument和其他類似元素,是專門為文本渲染創建的特殊元素。 除了專注於文本而不是圖形之外,它們屬於與形狀或裝飾器類似的類別。 例如,TextBlock不是Control,並在其OnRender方法上定義其外觀。 另一方面,標簽是一個控制; 但是如果你檢查它的模板,你會看到它最終使用TextBlock來顯示文本。

還有其他元素(如ContentPresenterItemsPresenter )沒有任何外觀,不是隱式的,不是默認情況下,不是樣式或模板。 這些是邏輯元素,用於定義視圖的結構。 例如,ContentPresenter獲取ContentControl的ContentContentTemplate屬性,並確保所述模板正確呈現並綁定到所述數據,可以這么說。 但他們沒有自己的視覺表現。

哦,我幾乎忘記了Panels 面板也不是控件,它們確實有自己的外觀。 但與Presenters類似,它們也是定義其他視覺元素如何可視化的邏輯元素。 更具體地說,他們的布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM