wpf的外观来自哪里?

时间:2015-07-17 08:44:31

标签: c# wpf

我刚读过WPF from Thomas Claudius Huber上的这本书。他说,所有WPF控制都是“无法看到的”#34;。他们只是从ControlTemplate获得他们的外观(和可视树)。这提出了一个问题: WPF的外观来自哪里?

我的意思是:Button的{​​{1}}有一些ControlTemplate和一个Border。这两个(ContentPresenterBorder)从哪里看?

我已经用Google搜索并发现,ContentPresenterBorder,并在Decorator - 方法中设置其外观。

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

1 个答案:

答案 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的ContentContentTemplate属性,并确保所述模板正确呈现并绑定到所述数据,可以这么说。但他们没有自己的视觉表现。

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