我刚读过Thomas Claudius Huber关于WPF的书.他表示,所有WPF控件都是"不露面"的.他们只是从他们的外观(和视觉树)ControlTemplate.这提出了一个问题:WPF的外观来自哪里?
我的意思是:在Button有ControlTemplate一些BorderS和ContentPresenter.这两个(Border和ContentPresenter)从哪里看?
我已经用Google搜索并发现,这Border是一个Decorator并在OnRender-Method中设置它的外观.
那是底线吗?没有ControlTemplate的所有其他元素是否在-Method中定义了它们的外观OnRender?
简短回答:是的.所有不是控件且具有"外观"的视觉元素,在其UIElement.OnRender方法覆盖中定义所述外观.
答案很长:控件不使用该OnRender方法来定义它们的外观.相反,他们的"外观"在样式和模板中定义.如果在应用程序中没有显式定义样式或模板,WPF控件只需使用当前系统主题中的默认样式和模板(有关主题的更多信息,请查看此MSDN文章).
我们只是说框架有自己的资源字典,其中包含所有内置控件的默认样式.例如,这是ComboBox的默认ControlTemplate:ComboBox样式和模板
话虽这么说,有几个可视组件通过代码定义其外观,通常通过OnRender覆盖.他们不是控制; 他们是装饰者,形状和类似的东西.具有"外观"的东西:边框,矩形等.但最后,所有控件都要看这些元素,因为所有ControlTemplates都由这些元素或其他控件组成.
TextBlock,作为Run,FlowDocument和其他类似元素,是专门为文本渲染创建的特殊元素.除了专注于文本而不是图形之外,它们属于与形状或装饰器类似的类别.例如,TextBlock不是Control,并在其OnRender方法上定义其外观.另一方面,标签是一个控制; 但是如果你检查它的模板,你会看到它最终使用TextBlock来显示文本.
还有其他元素(如ContentPresenter,ItemsPresenter)没有任何外观,不是隐式的,不是默认情况下,不是样式或模板.这些是逻辑元素,用于定义视图的结构.ContentPresenter,例如,抓住Content和ContentTemplate一个ContentControl中的性能,并确保使所述模板被正确地呈现,并结合上述数据,可以这么说.但他们没有自己的视觉表现.
哦,我几乎忘记了Panels.面板也不是控件,它们确实有自己的外观.但与Presenters类似,它们也是定义其他视觉元素如何可视化的逻辑元素.更具体地说,他们的布局.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |