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