WPF中样式和行为和触发器

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

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

1、样式。

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

定义一个普通的资源:

<Window.Resources>
    <!-- 定义一个FontFamily资源对象 -->
    <FontFamily x:Key="TextBlockFontFamily">楷体</FontFamily>
    <!-- 定义一个FontWeight资源对象 -->
    <FontWeight x:Key="TextBlockFontWeight">Bold</FontWeight>
</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对象设置元素的单个属性,只能设置依赖项属性,不能修改其他属性。

<TextBlock Text="孤独和迷茫时成长的必经之路!">
    <TextBlock.Style>
        <Style>
            <Setter Property="Control.FontWeight" Value="Bold"></Setter>
            <Setter Property="Control.FontSize" Value="20"></Setter>
        </Style>
    </TextBlock.Style>
</TextBlock>

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

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

 <!--如果不写x:key特性,就会自动为类元素设置style样式了,不用再通过元素的style属性设置样式了。-->
    <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>
        <!--通过x:Null取消样式设置。-->
        <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>

    <!--设置一个字体类型样式,通过BaseOn属性继承字体大小样式-->
    <Style x:Key="SetButtonFontFamily" BasedOn="{StaticResource SetButtonFontSize}">
        <Setter Property="Control.FontFamily" Value="楷体"></Setter>
    </Style>

    <!--设置一个字体粗细,通过BaseOn属性继承字体类型,这样这个样式就拥有了字体类型的字体大小的样式了-->
    <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">
                    <!--可将S属性样式写在Trigger.Setters中(方式一)-->
                    <!--<Trigger.Setters>
                            <Setter Property="Control.Foreground" Value="Red"></Setter>
                    </Trigger.Setters>-->

                    <!--(方式二)-->
                    <!--也可以直接写在Triggr中,视情况而定,如果触发器满足多个条件时,要使用第一种方式设置属性值。-->
                    <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>
                <!--通过Conditions属性设置多个条件(一个是获取焦点和鼠标移动到元素上。)。-->
                <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!

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

时间: 2024-10-10 13:37:19

WPF中样式和行为和触发器的相关文章

WPF中使用ValueConverter来实现“范围条件触发器”

在WPF中,我们知道界面层可以通过Trigger触发器实现“条件”——“赋值”的功能 属性触发器Property Trigger:当Dependency Property的值发生改变时触发.数据触发器Data Trigger: 当普通.NET属性的值发生改变时触发.事件触发器Event Trigger: 当路由时间被触发时调用. 属性触发器与数据触发器中又可有多条件触发器,即类似条件语句中“并”的效果 但发现触发器的应用场景,“条件”的限制都是“等于”,即变量在某个特定的值触发某个“赋值” 要是

关于WPF中关于样式和模板的区别

百度了下,改天整理. WPF中关于样式和模板的区别: 回答一: 1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resources> <Style  TargetType="Button"> <Setter Property="Background" Value="Yellow" />

wpf 中DataGrid 控件的样式设置及使用

本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </summary> public class Experience { /// <summary> /// 获取或设置工作的起始时间 /// </summary> public string Start { get; set; } /// <summary> /// 获

WPF 样式(定义样式、引用样式、样式作用域、Trigger触发器)

1.定义 资源字典 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">   <RadialGradientBrush x:Key="mybrush">   <GradientStop

WPF中的Visual Tree和Logical Tree与路由事件

1.Visual Tree和Logical TreeLogical Tree:逻辑树,WPF中用户界面有一个对象树构建而成,这棵树叫做逻辑树,元素的声明分层结构形成了所谓的逻辑树!!Visual Tree:可视树(也叫视觉树),可视树是对逻辑树的扩展,可视树将逻辑树的节点打散,分放到核心棵树组件中,它表述了一些详细的可视化实现,而不是把每个元素当做一个”黑盒“.我们以一个简单的程序来观察下逻辑树与可视树: <Window x:Class="WpfApplication28.MainWind

WPF编程—样式

WPF编程学习——样式 本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的样式的作用,就像Web中的CSS一样,为界面上的元素定制外观,以提供更好的用户界面.在WPF应用程序中,通过控件的属性,我们也可以实现更改控件的外观.但是,这种方式局限性大.不灵活且不利于维护.例如: 复制代码 <Grid> <Button Width="8

[转]在WPF中区别TextBlock和Label

TextBlock和Label都是用来显示少量数据的.好多文章对Label存在的描述都是它允许使用"快速获取"."快速获取"就是允许你用Alt加上其它的按键快速和UI界面的某个控件交互,比如你可以用ALT加上O键来点击一个OK按钮. TextBlock直接继承于FrameworkElement,而Label继承于ContentControl.这样看来,Label可以做这样的事情: 1.可以定义一个控件模板(通过Template属性) 2.可以显示出string以外的

从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第五讲 WPF中 Style

Style这个东西几乎是无处不在,这个类似于web开发中的css样式,想要做一个很丰富的UI,这个东西是必不可少的,我也不是专业的UI开发者,这边只能介绍Style在WPF中的用法 下面有一个下载地址,这个demo还可以供初学者学习 Style基本用法: 在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格. Style是作

WPF: WPF 中的 Triggers 和 VisualStateManager

在之前写的这篇文章 WPF: 只读依赖属性的介绍与实践 中,我们介绍了在 WPF 自定义控件中如何添加只读依赖属性,并且使其结合属性触发器 (Trigger) 来实现对控件样式的改变.事实上,关于触发器,在 WPF 中除了属性触发器,还有事件触发器 (EventTrigger) 和数据触发器 (DataTrigger).此外,为了控制控件外观的切换,除了可以使用触发器外,我们还可以使用 VisualStates 和 VisualStateManager 来完成. 本文接下来会分别简单地介绍 Tr