WPF触发器

在 WPF(Windows Presentation Foundation)中,触发器是一种机制,用于在满足特定条件时自动更改控件的属性或执行某些操作。它可以基于属性值的变化、事件的发生等来触发。例如,当鼠标移到按钮上(触发鼠标悬停事件)时,按钮的背景色发生变化,这就可以通过触发器来实现。
主要有三种类型的触发器:属性触发器(PropertyTrigger)、事件触发器(EventTrigger)和数据触发器(DataTrigger)。

1. 属性触发器

以一个按钮的 【鼠标移动至按钮上方】触发为例

cs 复制代码
<Window x:Class="Trigger.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <StackPanel Margin="20">
        <Button Height="25" Content="sssss">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <Border Background="{TemplateBinding Background}" 
         BorderBrush="Black" BorderThickness="1" CornerRadius="2">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Button.Template>
            <Button.Style>
                <Style TargetType="Button">
                    <Setter Property="Background" Value="Yellow"/>
                    <Setter Property="Foreground" Value="Black"/>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Black"/>
                            <Setter Property="Foreground" Value="Yellow"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    </StackPanel>
</Window>

上述代码中,

<Button.Template>

<ControlTemplate TargetType="Button">

<Border Background="{TemplateBinding Background}"

BorderBrush="Black" BorderThickness="1" CornerRadius="2">

<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>

</Border>

</ControlTemplate>

</Button.Template>

定义了button控件的模板,因为 WPF中的某些控件(如Button)使用默认的ControlTemplate,在ControlTemplate中可能已显式设置了Background属性,这会导致触发器中指定的Background属性没有生效。

运行效果

属性触发器

2. 事件触发器

给按钮设置一个透明度改变的动画,在按钮被点击时触发动画

cs 复制代码
<Window x:Class="Trigger.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <StackPanel Margin="20">
        <Button Name="AnimatedButton" Content="Click Me!" Width="100" Height="50">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                     From="1.0" To="0.0" Duration="0:0:1"
                                     AutoReverse="True"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </StackPanel>
</Window>

执行效果

事件触发器

3. 数据触发器

假设有一个数据绑定的场景。有一个CheckBox和一个TextBlock。当CheckBox被选中(IsChecked属性为true)时,TextBlock的文字颜色变为LightGreen背景变为Black

3.1 绑定字段

在VM中创建要绑定的字段 ,这里绑定用了Prism框架,需要using Prism.mvvm

cs 复制代码
using Prism.Mvvm;

namespace Trigger.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "PrismApplication";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private bool _isChecked =false;
        public bool IsChecked
        {
            get { return _isChecked; }
            set { SetProperty(ref _isChecked, value); }
        }

        public MainWindowViewModel()
        {
        }
    }
}

3.2 设定数据触发器 并给触发器绑定数据字段

cs 复制代码
<Window x:Class="Trigger.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <StackPanel Margin="20" HorizontalAlignment="Center">
        <CheckBox Content="Select Option" IsChecked="{Binding IsChecked}"/>
        <TextBlock Text="Some Text">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsChecked}" Value="true">
                            <Setter Property="Foreground" Value="LightGreen"/>
                            <Setter Property="Background" Value="Black"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>
</Window>

执行效果

数据触发器

相关推荐
没有bug.的程序员1 天前
SOA、微服务、分布式系统的区别与联系
java·jvm·微服务·架构·wpf·日志·gc
Macbethad1 天前
基于WPF的半导体设备配方管理程序技术方案
wpf
FuckPatience1 天前
WPF Geometry
wpf
武藤一雄2 天前
.NET 中常见计时器大全
microsoft·微软·c#·.net·wpf·.netcore
MarkHD2 天前
车辆TBOX科普 第70次 AUTOSAR Adaptive、容器化与云原生的融合革命
云原生·wpf
极客智造2 天前
WPF Behavior 实战:自定义 InvokeCommandAction 实现事件与命令解耦
wpf
L、2182 天前
Flutter 与 OpenHarmony 深度集成:构建分布式多端协同应用
分布式·flutter·wpf
布伦鸽2 天前
C# WPF -MaterialDesignTheme 找不到资源“xxx“问题记录
开发语言·c#·wpf
小二·3 天前
MyBatis基础入门《十五》分布式事务实战:Seata + MyBatis 实现跨服务数据一致性
分布式·wpf·mybatis
helloworddm3 天前
UnregisterManyAsync
wpf