c# - wpf的look是从哪里来的?

标签 c# wpf

我刚刚在 WPF from Thomas Claudius Huber 上读了这本书.他说,所有 WPF 控件都是“无形的”。他们只是从他们的 ControlTemplate 中获得他们的外观(和可视化树)。这就提出了一个问题:WPF 的外观从何而来?

我的意思是:Button 有一个带有一些 BorderControlTemplate 和一个 ContentPresenter。这两个(BorderContentPresenter)从哪里获得外观?

我已经用谷歌搜索并发现,Border 是一个 Decorator 并在 OnRender-Method 中设置它的外观。

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

最佳答案

简短回答:。所有非控件且具有“外观”的可视元素,在其 UIElement.OnRender 方法覆盖中定义所述外观。

长答案:控件不使用OnRender 方法来定义它们的外观。相反,它们的“外观”是在样式和模板中定义的。当应用程序中未明确定义样式或模板时,WPF 控件仅使用当前系统主题 中的默认样式和模板(有关主题的更多信息,请查看 this MSDN article)。

假设框架有自己的资源字典,所有内置控件都有默认样式。例如,这里是 ComboBox 的默认 ControlTemplate:ComboBox Styles and Templates

也就是说,有几个视觉组件的外观是通过代码定义的,通常是通过 OnRender 重写。他们不是控制;它们是DecoratorsShapes 之类的东西。确实具有“外观”的事物:边框、矩形等。但归根结底,所有控件都具有外观要归功于这些元素,因为所有 ControlTemplate 都由这些元素或其他控件组成。

TextBlockRunFlowDocument等类似元素,都是专门为文本渲染而创建的特殊元素。它们与 Shapes 或 Decorators 属于相似的类别,只是它们专注于文本而不是图形。例如,TextBlock 不是控件,它在 OnRender 方法上定义了它的外观。另一方面,标签是一个控件;但是如果你检查它的模板,你会看到它最终使用 TextBlock 来显示文本。

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

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

关于c# - wpf的look是从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471692/

相关文章:

c# - 使 .NET WebBrowser 不与 IE 或其他实例共享 cookie

c# 使用 Process.Start 发送电子邮件

c# - 绕过 .net 核心中的无效 SSL 证书

c# - 从新创建的窗口访问主窗口数据上下文

c# - WPF DataGrid 自动生成的列,更改标题名称

c# - 移动鼠标时 WPF 窗口滞后

C# 属性初始化语法名称

c# - 使用授权中间件而不是授权属性 ASP NET Core

c# - 如何以最优雅的方式将数据绑定(bind)到 ItemsControl 中的特定项目属性?

wpf - 在没有绑定(bind)的情况下通过 DataContext 从 ViewModel 获取值(value)?