wpf的外观从何而来?
本文关键字:外观 wpf | 更新日期: 2023-09-27 18:03:15
我刚刚读了Thomas Claudius Huber关于WPF的书。他说,所有WPF控件都是"不好看的"。他们只是从他们的ControlTemplate
获得他们的外观(和视觉树)。这就提出了一个问题:WPF的外观从何而来?
我的意思是:Button
有一个ControlTemplate
,一些Border
s和一个ContentPresenter
。这两个(Border
和ContentPresenter
)从哪里得到他们的外观?
我已经在谷歌上搜索并发现,Border
是Decorator
,并在OnRender
-方法中设置其外观。
这是底线吗?是否所有其他元素没有一个ControlTemplate定义他们的外观在OnRender
-方法?
简短回答:是。所有非控件的具有"look"的可视元素,在它们的UIElement.OnRender
方法override中定义该look。
长话短说:控件不使用OnRender
方法来定义它们的外观。相反,它们的"外观"在样式和模板中定义。当应用程序中没有明确定义样式或模板时,WPF控件仅使用当前系统主题中的默认样式和模板(有关主题的更多信息,请查看MSDN文章)。
让我们假设框架有自己的资源字典,所有内置控件都有默认样式。例如,下面是ComboBox的默认ControlTemplate:
也就是说,有几个可视化组件的外观是通过代码定义的,通常是通过OnRender
重写。它们不是控制;它们是 decorator , Shapes等等。有"外观"的东西:边框、矩形等。但是最后,所有的控件看起来都要感谢这些元素,因为所有的ControlTemplates都是由这些元素或其他控件组成的。
TextBlock,如Run, FlowDocument和其他类似的元素,是专门为文本渲染而创建的特殊元素。它们与形状或装饰器属于类似的类别,不同之处在于它们专门处理文本而不是图形。例如,TextBlock不是控件,它在其OnRender
方法上定义其外观。另一方面,标签是一种控制;但是如果你检查它的模板,你会看到它最终使用一个TextBlock来显示文本。
还有其他元素(如ContentPresenter, ItemsPresenter)没有任何外观,不是隐式的,不是默认的,不是样式或模板。这些是定义视图结构的逻辑元素。例如,ContentPresenter获取ContentControl的Content
和ContentTemplate
属性,并确保所述模板被正确呈现并绑定到所述数据,可以这么说。但是他们没有自己的视觉表现。
哦,我差点忘了Panels。面板也不是控件,它们确实有自己的外观。但与演示器类似,它们也是逻辑元素,定义了其他视觉元素的可视化方式。更具体地说,是它们的布局。