我刚刚在 WPF from Thomas Claudius Huber 上读了这本书.他说,所有 WPF 控件都是“无形的”。他们只是从他们的 ControlTemplate
中获得他们的外观(和可视化树)。这就提出了一个问题:WPF 的外观从何而来?
我的意思是:Button
有一个带有一些 Border
的 ControlTemplate
和一个 ContentPresenter
。这两个(Border
和 ContentPresenter
)从哪里获得外观?
我已经用谷歌搜索并发现,Border
是一个 Decorator
并在 OnRender
-Method 中设置它的外观。
这是底线吗?是否所有其他没有 ControlTemplate 的元素都在 OnRender
-Method 中定义它们的外观?
最佳答案
简短回答:是。所有非控件且具有“外观”的可视元素,在其 UIElement.OnRender
方法覆盖中定义所述外观。
长答案:控件不使用OnRender
方法来定义它们的外观。相反,它们的“外观”是在样式和模板中定义的。当应用程序中未明确定义样式或模板时,WPF 控件仅使用当前系统主题 中的默认样式和模板(有关主题的更多信息,请查看 this MSDN article)。
假设框架有自己的资源字典,所有内置控件都有默认样式。例如,这里是 ComboBox 的默认 ControlTemplate:ComboBox Styles and Templates
也就是说,有几个视觉组件的外观是通过代码定义的,通常是通过 OnRender
重写。他们不是控制;它们是Decorators、Shapes 之类的东西。确实具有“外观”的事物:边框、矩形等。但归根结底,所有控件都具有外观要归功于这些元素,因为所有 ControlTemplate 都由这些元素或其他控件组成。
TextBlock与Run、FlowDocument等类似元素,都是专门为文本渲染而创建的特殊元素。它们与 Shapes 或 Decorators 属于相似的类别,只是它们专注于文本而不是图形。例如,TextBlock 不是控件,它在 OnRender
方法上定义了它的外观。另一方面,标签是一个控件;但是如果你检查它的模板,你会看到它最终使用 TextBlock 来显示文本。
还有其他元素(如 ContentPresenter、ItemsPresenter)没有任何外观,不是隐含的,不是默认的,不是通过样式或模板。这些是定义 View 结构的逻辑元素。例如,ContentPresenter 获取 ContentControl 的 Content
和 ContentTemplate
属性,并确保正确呈现所述模板并绑定(bind)到所述数据,可以这么说。但他们没有自己的视觉表现。
哦,我差点忘了面板。面板也不是控件,它们确实有自己的外观。但与 Presenter 类似,它们也是定义其他视觉元素如何可视化的逻辑元素。更具体地说,它们的布局。
关于c# - wpf的look是从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471692/