WPF样式(Style)与模板(template)区别

2024-08-29 17:52

本文主要是介绍WPF样式(Style)与模板(template)区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WPF(Windows Presentation Foundation)中的样式和模板都是用于控件外观的重要机制,但它们的目的和使用方式略有不同。

1. 样式

样式是一种可以重复使用的视觉元素,用于定义控件的外观和行为。一旦定义一个样式,可以在应用程序中的多个控件中重复使用它。样式可以包含多种视觉元素,如布局属性、事件触发程序、转换器和动画等。要使用样式,可以在XAML文件中定义"Style"元素,并在控件上设置"Style"属性。以下是一个简单的样式示例:

```xml
<Window.Resources><Style x:Key="RedButtonStyle" TargetType="{x:Type Button}"><Setter Property="Background" Value="Red"/><Setter Property="Foreground" Value="White"/><Setter Property="FontSize" Value="14"/>
</Style>
</Window.Resources>
<Button Style="{StaticResource RedButtonStyle}" Content="Click me!"/>
```

这个示例定义了一个名为"RedButtonStyle"的按钮样式,它将按钮的背景设置为红色,前景设置为白色,字体大小设置为14。然后,该样式被应用到一个按钮上。

2. 模板

模板是一种可以完全自定义和重写控件外观的机制。它不仅可以控制控件的外观,还可以改变控件的内部结构和行为。使用模板可以更好地控制控件的呈现方式,以满足各种外观和功能需求。要使用模板,可以在XAML文件中定义"ControlTemplate"元素,并在控件上设置"Template"属性。

以下是一个简单的模板示例,它定义了一个自定义的按钮模板:

```xml
<Window.Resources><ControlTemplate x:Key="CustomButtonTemplate" TargetType="{x:Type Button}"><Border Background="Red" BorderThickness="1" BorderBrush="Gray"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Border></ControlTemplate>
</Window.Resources>
<Button Template="{StaticResource CustomButtonTemplate}" Content="Click me!"/>
```

这个示例定义了一个名为"CustomButtonTemplate"的按钮模板,它将按钮的背景设置为红色,边框设置为灰色,然后将内容放置在中心。然后,该模板被应用到一个按钮上。

总之,样式和模板都是WPF中非常强大的控件外观机制,它们可以帮助开发人员更好地管理控件的视觉设计和行为。样式用于定义控件的外观属性,而模板则用于完全自定义和重写控件的外观和行为。

3.样式里面设置控件模板
    <Style x:Key="DefaultRadioButton" TargetType="{x:Type RadioButton}"><!--<Setter Property="Background" Value="Transparent"></Setter><Setter Property="Padding" Value="0"></Setter>Margin="3,4,3,5"--><Setter Property="VerticalContentAlignment" Value="Center"/><Setter Property="HorizontalContentAlignment" Value="Center"/><Setter Property="Foreground" Value="White"/><Setter Property="Margin" Value="0,0,4,0"/><Setter Property="Height" Value="30"/><Setter Property="Width" Value="130"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type RadioButton}"><Border x:Name="button"  ><ContentPresenter  VerticalAlignment="Center" HorizontalAlignment="Center" /></Border><!--触发器:设置选中状态符号"CornflowerBlue"--><ControlTemplate.Triggers><Trigger Property="IsChecked" Value="true"><Setter Property="Background" Value="Khaki" TargetName="button"/><Setter Property="BorderBrush" Value="DarkOrange" TargetName="button"/><Setter Property="BorderThickness" Value="2" TargetName="button"/><Setter Property="Foreground" Value="Black"/></Trigger><Trigger Property="IsChecked" Value="false"><Setter Property="Background" Value="{StaticResource BrushButtonRG2}"  TargetName="button"/><Setter Property="Foreground" Value="White"/><Setter Property="BorderBrush" Value="darkgray" TargetName="button"/><Setter Property="BorderThickness" Value="1" TargetName="button"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style>

小结:

样式style(小打小闹):保留原本控件外观:可修改布局属性,事件触发器(Trigger),转换器(Converter)和动画(animation)等

模板Template(可完全自定义和重写原有控件外观):不仅可以控制控件的外观,还可以改变控件的内部结构和行为。使用模板可以更好地控制控件的呈现方式,以满足各种外观和功能需求

4.补充

在 WPF 中,样式(Style)模板(Template) 是用来定义 UI 元素外观和行为的两种不同机制:

  • 样式(Style):定义控件的外观(控件颜色、字体)和行为(事件处理和转换器)的一组属性。它可以设置控件的颜色、字体、边框等外观特征,也可以定义控件的行为(如事件处理)。样式主要用于重用和一致性,方便在整个应用程序中应用统一的视觉风格。

  • 模板(Template  控件模板和数据模板):定义控件的内部结构和布局。它决定了控件的呈现方式,包括控件的视觉层级和组成部分。例如,ControlTemplate 定义了控件的整体布局和可视化结构,而 DataTemplate 定义了数据对象如何呈现为 UI 元素

关系样式可以包含模板,使用模板可以定制控件的具体外观。样式提供了控件的外观和行为,而模板决定了控件的结构(控件模板)和数据表现方式(数据模板)。通过样式和模板的结合-->可以实现高度自定义的用户界面设计。

这篇关于WPF样式(Style)与模板(template)区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118555

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

最大流、 最小费用最大流终极版模板

最大流  const int inf = 1000000000 ;const int maxn = 20000 , maxm = 500000 ;struct Edge{int v , f ,next ;Edge(){}Edge(int _v , int _f , int _next):v(_v) ,f(_f),next(_next){}};int sourse , mee

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使