繁体   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