wpf的外观从何而来?

本文关键字:外观 wpf | 更新日期: 2023-09-27 18:03:15

我刚刚读了Thomas Claudius Huber关于WPF的书。他说,所有WPF控件都是"不好看的"。他们只是从他们的ControlTemplate获得他们的外观(和视觉树)。这就提出了一个问题:WPF的外观从何而来?

我的意思是:Button有一个ControlTemplate,一些Border s和一个ContentPresenter。这两个(BorderContentPresenter)从哪里得到他们的外观?

我已经在谷歌上搜索并发现,BorderDecorator,并在OnRender -方法中设置其外观。

这是底线吗?是否所有其他元素没有一个ControlTemplate定义他们的外观在OnRender -方法?

wpf的外观从何而来?

简短回答:。所有非控件的具有"look"的可视元素,在它们的UIElement.OnRender方法override中定义该look。

长话短说:控件不使用OnRender方法来定义它们的外观。相反,它们的"外观"在样式和模板中定义。当应用程序中没有明确定义样式或模板时,WPF控件仅使用当前系统主题中的默认样式和模板(有关主题的更多信息,请查看MSDN文章)。

让我们假设框架有自己的资源字典,所有内置控件都有默认样式。例如,下面是ComboBox的默认ControlTemplate:

也就是说,有几个可视化组件的外观是通过代码定义的,通常是通过OnRender重写。它们不是控制;它们是 decorator Shapes等等。有"外观"的东西:边框、矩形等。但是最后,所有的控件看起来都要感谢这些元素,因为所有的ControlTemplates都是由这些元素或其他控件组成的。

TextBlock,如RunFlowDocument和其他类似的元素,是专门为文本渲染而创建的特殊元素。它们与形状或装饰器属于类似的类别,不同之处在于它们专门处理文本而不是图形。例如,TextBlock不是控件,它在其OnRender方法上定义其外观。另一方面,标签是一种控制;但是如果你检查它的模板,你会看到它最终使用一个TextBlock来显示文本。

还有其他元素(如ContentPresenterItemsPresenter)没有任何外观,不是隐式的,不是默认的,不是样式或模板。这些是定义视图结构的逻辑元素。例如,ContentPresenter获取ContentControl的ContentContentTemplate属性,并确保所述模板被正确呈现并绑定到所述数据,可以这么说。但是他们没有自己的视觉表现。

哦,我差点忘了Panels。面板也不是控件,它们确实有自己的外观。但与演示器类似,它们也是逻辑元素,定义了其他视觉元素的可视化方式。更具体地说,是它们的布局。