WPF样式

初学者。博客仅做个人的理解整理,不到位的地方欢迎大佬们指出,感谢。

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只能改变控件的样式,已存在的属性的值。想要修改控件内部的结构需要使用控件模板

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值