初学者。博客仅做个人的理解整理,不到位的地方欢迎大佬们指出,感谢。
1.什么是样式,为什么需要样式
样式可以自定义控件的属性,比如修改button的字体、前景色、背景色、边框厚度颜色等。
2.如何定义一个样式并引用
2.1在控件本身的Resource中定义
<Button Content="test1" >
<Button.Resources>
<Style TargetType="{x:Type Button}" >
<Setter Property="Background" Value="Red"/>
<Setter Property="FontSize" Value="30"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="50"/>
</Style>
</Button.Resources>
在button本身的资源中定义一个样式(style),修改button的属性:width height fontsize
一个样式的基本格式:一个style标签内部包含一个setter标签。另外style内部可以包含多个setter。setter的意思是给某个属性的值设置成多少。Property是控件的属性,Value是这个属性的值。样式的作用既然是修改控件的属性的,wpf中有很多种控件,这时候需要一个TargetType来指定一下具体的控件,如button。
<Style TargetType="{x:Type Button}" >
<Setter Property="Background" Value="Red"/>
</Style>
2.2在windows.Resource中定义
上面的方法是吧一个style写在某个控件的本身的resource里面,这样的弊端是,只能这个控件用,也就是说这个style的作用范围只能是这个button,在另外一个button里面引用不到,有点类似于代码里面的局部变量。
添加2个button看下效果:因为style是写在第一个button里面的,所以第二个button没有引用到这个style。
<StackPanel>
<Button Content="test1" >
<Button.Resources>
<Style TargetType="{x:Type Button}" >
<Setter Property="Background" Value="Red"/>
<Setter Property="FontSize" Value="30"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="50"/>
</Style>
</Button.Resources>
</Button>
<Button Content="test2" />
</StackPanel>
把style定义在window.Resource里面看下效果,这样2个button都可以引用到同一个style了。
<Window.Resources>
<Style TargetType="Button" >
<Setter Property="Background" Value="Red"/>
<Setter Property="FontSize" Value="30"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="50"/>
</Style>
</Window.Resources>
<Grid>
<StackPanel>
<Button Content="test1" />
<Button Content="test2" />
</StackPanel>
</Grid>
还是有个问题,我定义了一个style,它的targetType是button,那界面上所有的button都会使用这个style。如果我不想让某个button使用这个style怎么办?
可以给style添加一个名字,这样可以控制某个button是否使用这个style。
<Style TargetType="Button" x:Key="mystyle" >
使用style
<Button Content="test1" Style="{StaticResource mystyle}" />
不使用style
<Button Content="test2" />
3.样式的一些基本属性
3.1 Setter
用来设置具体的属性,只要这个控件有的属性,都能在setter里面的Property里识别到
3.2Targettype
这个style是准备让哪种控件来用的
3.3Baseon
style可以发生继承关系,子style可以继承父style的所有设置
效果:
3.4Triggs
样式除了包含setter还可以设置trigger。简单理解,trigger就是触发器,当某个某个属性为某个值时,就执行一些操作,根据trigger去操作setter。
3.4.1 triggers
style里写trigger的语法
<Style TargetType="Button" x:Key="btn">
<Setter Property="Content" Value="没触发"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Content" Value="触发了" />
</Trigger>
</Style.Triggers>
</Style>
默认省略了一个标签,原型是
<Style TargetType="Button" x:Key="btn">
<Style.Setters>
<Setter Property="Content" Value="没触发"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Content" Value="触发了" />
</Trigger>
</Style.Triggers>
</Style>
在style.settes里写一些属性之类的,在style.triggers里写条件。setter是必须要写的,所以省略了这一句,trigger是可写可不写的,所以要加style.triggers。
当满足什么条件时,去修改某个属性的值,trigger里面也是写sette。
3.4.2 MultiTrigger
可以写多个条件,类似于逻辑 与 ,这些条件都满足时才触发(去修改某个属性)
语法是:
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Content" Value="触发了" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
<Condition Property="IsPressed" Value="True"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Content" Value="MultiTrigger!"/>
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
4.样式的引用顺序问题
4.1定义在控件本身的resource中,则只能这个控件自己用
4.2同名的style,后定义的style生效(不能在window.Resource中定义重名的style)
4.3style里定义了属性,然后在控件中又手动定义具体的属性,怎么办?
5.样式写key和不写key的区别(不能在windo.Resource中定义重名的style,)
style在window.resource的情况:不写key的话,整个windows窗体内部的相同的控件都会自动引用。写key的话,整个windows窗体内部的相同的控件都默认不引用,需要手动引用
6.style的嵌套
style属于一种资源,引用是通过staticResource或者DynamicResource引用,那style里面可以引用其他的资源吗?(可以)
效果图:
还可以在资源中定义double int string类型的值
7.style里面的trigger和控件模板中的trigger有什么区别?
模板中的trigger的优先级大于style中的trigger
8.style和控件模板的区别?
style只能改变控件的样式,已存在的属性的值。想要修改控件内部的结构需要使用控件模板