WPF中样式和行为和触发器

2021-03-22 18:26

阅读:543

标签:不用   setter   功能   封装   bsp   窗口   方案   tac   嵌套   

原文:WPF中样式和行为和触发器

样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距、内边距、颜色以及字体等细节。而是创建一系列封装所有这些细节的样式,然后在需要之处通过属性来设置样式。名称空间是System.Windows。

1、样式。

为了理解适合使用样式的集合,分析一个简单的示例,设想需要标准化在窗口中使用的字体,最简单的方式是设置包含窗口的字体属性,这些属性都是在Control类中定义的,包括FontFamily、FontSize、FontWeight,得益于这些属性值的继承,当在窗口级别设置这些属性时,窗口中的所有元素都会使用相同的属性值。

定义一个普通的资源: 

Window.Resources>        
    
    FontFamily x:Key="TextBlockFontFamily">楷体FontFamily>
    
    FontWeight x:Key="TextBlockFontWeight">BoldFontWeight>
Window.Resources>

定义一个TextBlock,引用资源: 

 TextBlock FontFamily="{StaticResource TextBlockFontFamily}" FontSize="30" FontWeight="{StaticResource TextBlockFontWeight}">今天天气好晴朗!!!TextBlock>

 在使用资源设置属性时,正确地匹配类型是非常重要的,这个时候用到的是类型转换器,如果为元素设置FontFamily对象,FontFamilyConverter转换器会创建所需要的FontFamily对象。

这种写法的弊端:

除了资源名称相似外,并没有明确指明这三个资源是相关的,这使维护变得非常复杂。

需要使用资源的标记非常繁琐。

这个时候样式就可以很好地解决这种解决方案(定义样式): 

Window.Resources>     
    Style x:Key="TextBlockStyle">
        Setter Property="Control.FontFamily" Value="楷体">Setter>
        Setter Property="Control.FontSize" Value="20">Setter>
        Setter Property="Control.FontWeight" Value="Bold">Setter>
    Style>
Window.Resources>

名叫TextBlockStyle的样式对象包含了一个设置器集合,该集合包含了三个Setter对象,每一个Setter对象用于一个希望设置的属性,每个setter属性对象由两部分信息组成,分别是希望进行设置的属性名称和希望为该属性应用的值。与所有资源一样,样式和对象都有一个键名。

在xaml中引用: 

TextBlock Name="TextBlock1" Style="{StaticResource TextBlockStyle}">Hello,World!!!TextBlock>

用代码设置: 

TextBlock1.Style = (Style)FindResource("TextBlockStyle");

 2、Style类的常用属性。 

Style类的常用属性

属性名

说明

Setters

 设置属性值以及自动关联事件处理程序的Setter对象或者EventSetter对象的集合。

Triggers

 继承自TriggerBase类,并能自动改样式设置对象的集合,例如当某个属性改变时,或者是发生某个事件时,可以修改样式。
 

Resources

 希望用于样式的资源集合。
 

BaseOn

 通过该属性可用于创建继承自其他样式设置的更具体形式。
 

TargetType

 该属性标识应用央视的元素的类型,通过该属性可创建只影响特定类型元素的设置器,还可以创建能够为恰当的元素类型自动其作用的设置器。

 

 

 

 

 

 

 

 

 

 

 

 

 

3、创建样式对象(嵌套元素)。

每一个Style对象都封装了一个Setter对象的集合,每个Setter对象设置元素的单个属性,只能设置依赖项属性,不能修改其他属性

"孤独和迷茫时成长的必经之路!">
    

 4、设置元素类型(TargetType)并自动应用样式。

 通过TargetType指定类类型。如果去掉x:key特性,那么就会自动应用到元素类型了。将元素的Style属性设置为x:Null 可取消自动应用样式。

 
    Window.Resources>
        Style TargetType="Button" >
            Setter Property="Control.FontFamily" Value="楷体">Setter>
            Setter Property="Control.FontWeight" Value="Bold">Setter>
            Setter Property="Control.FontSize" Value="30">Setter>
        Style>
    Window.Resources>

    StackPanel>
        Button Height="50">孤独和时成长的必经之路!Button>
        
        Button Height="50" Style="{x:Null}">孤独和时成长的必经之路!Button>
    StackPanel>

 6、多层样式(通过BaseOn继承)。

尽管可在许多不同层次定义任意数量的样式,但每个WPF元素一次只能使用一个样式对象。这好像是一种限制,但由于属性值继承和样式继承特性,可通过BaseOn属性继承样式即可。 如果两次设置了同一个属性,那么最后一次设置的样式会覆盖之前设置的样式。

Window.Resources>
    
    Style x:Key="SetButtonFontSize">
        Setter Property="Control.FontSize" Value="30">Setter>
    Style>

    
    Style x:Key="SetButtonFontFamily" BasedOn="{StaticResource SetButtonFontSize}">
        Setter Property="Control.FontFamily" Value="楷体">Setter>
    Style>

    
    Style x:Key="SetButtonBold" BasedOn="{StaticResource SetButtonFontFamily}">
        Setter Property="Control.FontWeight" Value="Bold">Setter>
     
        Setter Property="Control.FontSize" Value="40">Setter>
    Style>
Window.Resources>

StackPanel>
    Button Style="{StaticResource SetButtonBold}">Hello,World!!!Button>
StackPanel>

 7、触发器(Trigger)。

WPF有个主题,就是以声明的方式扩展代码的功能,当使用样式、资源或者数据绑定时,将发现即使不适用代码,也能完成不少工作,这个时候就要使用触发器了,当属性发生变化时,可以进行响应,并自动调整样式。每个样式可以有任意多个触发器,而且每个触发器都是System.Windows.TriggerBase的派生类的实例。

简单理解就是:在样式中设置触发器,在触发器中设置属性名称和属性值。

继承自TriggerBase的类

Trigger

这是一种简单的触发器,可以监测依赖项属性的变化,然后使用设置器改变样式

MultiTrigger

与Trigger类似,但这种触发器联合了多个条件,只有满足了所有这些条件,才会启动出触发器

DataTrigger

数据绑定触发器

MultiDataTrigger

联合多个数据触发器

EventTrigger

这是复杂的触发器,当事件发生时,这种触发器应用动画

 

 

 

 

 

 

 

 

 

 

7.1、简单触发器。

可以为任何依赖项属性关联简单触发器,每个简单的触发器都指定了正在监视的属性,以及正在等待的属性值,当属性值出现时,将应用存储在Trigger.Setters集合中的设置器(不能使用复杂的触发器逻辑)。

Window.Resources>
    Style x:Key="BigFontButton">
        Style.Setters>
            Setter Property="Control.FontSize" Value="30">Setter>
            Setter Property="Control.FontFamily" Value="楷体">Setter>
        Style.Setters>

        
        Style.Triggers>
            
            Trigger Property="Control.IsFocused" Value="true">
                
                Setter Property="Control.Foreground" Value="Pink">Setter>
            Trigger>                
        Style.Triggers>
    Style>

    
    Style x:Key="SetButton">
        Style.Triggers>
            Trigger Property="Control.IsFocused" Value="true">
                Setter Property="Control.Background" Value="Yellow">Setter>
            Trigger>
        Style.Triggers>
    Style>        
Window.Resources>

StackPanel>
    
    Button Style="{StaticResource BigFontButton}">Hello,World!!!Button>      
        
    Button Style="{StaticResource SetButton}" Height="50" FontSize="30">Hello,World!!!Button>
StackPanel>  

 7.2、为元素设置样式(嵌套形式)。 

Button Height="50" FontSize="30" Content="今天天气好晴朗!!!">
    Button.Style>
        Style>
            Style.Triggers>
                Trigger Property="Control.IsMouseOver" Value="true">
                    
                    

                    
                    
                    Setter Property="Control.Foreground" Value="Red">Setter>
                Trigger>
            Style.Triggers>
        Style>
    Button.Style>
Button>

 7.3、MultiTrigger触发器(满足多条件的触发器)。

如果希望创建只有当几个条件都为真时才激活的触发器,可使用MultiTrigger,这种触发器提供了一个Conditions(条件)集合,可通过该集合定义一系列属性值的集合。

Window.Resources>
    Style x:Key="SetButton">
        
        Style.Triggers>
            
            MultiTrigger>
                
                MultiTrigger.Conditions>
                    Condition Property="Control.IsFocused" Value="true">Condition>
                    Condition Property="Control.IsMouseOver" Value="true">Condition>
                MultiTrigger.Conditions>

                
                MultiTrigger.Setters>
                    Setter Property="Control.FontSize" Value="30">Setter>
                MultiTrigger.Setters>                    
            MultiTrigger>                
        Style.Triggers>
    Style>
Window.Resources>

StackPanel>
    
    Button Style="{StaticResource SetButton}">Hello,World!!!Button>
StackPanel>

 7.4、事件触发器。

普通触发器是等待属性发生变化,而事件触发器是等待特定的事件被引发。事件触发器要求用户提供一系列修改控件的动作,这些动作通常被应用为动画。 

Window.Resources>
    Style x:Key="SetButtonMouseOver">
        
        Style.Triggers>
            
            EventTrigger RoutedEvent="Control.MouseEnter">
                
                EventTrigger.Actions>
                    BeginStoryboard>                            
                        Storyboard>
                             DoubleAnimation Duration="0:0:0:2" Storyboard.TargetProperty="FontSize" To="30">DoubleAnimation>
                        Storyboard>
                    BeginStoryboard>
                EventTrigger.Actions>
            EventTrigger>
        Style.Triggers>
    Style>
Window.Resources>

StackPanel>
    
    Button Style="{StaticResource SetButtonMouseOver}">Hello,World!!!Button>
StackPanel>

 End!

WPF中样式和行为和触发器

标签:不用   setter   功能   封装   bsp   窗口   方案   tac   嵌套   

原文地址:https://www.cnblogs.com/lonelyxmas/p/9479038.html


评论


亲,登录后才可以留言!