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

  • 相关阅读:
    yum 下载安装包以及依赖包
    《将博客搬至CSDN》
    Lucene
    Solr
    LVS原理详解(3种工作模式及8种调度算法)
    正向代理与反向代理
    网关,网卡
    NAT地址转换
    Nginx学习总结
    网络_OSI模型_数据包传输
  • 原文地址:https://www.cnblogs.com/1024E/p/15726038.html
Copyright © 2020-2023  润新知