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>

执行效果

数据触发器

相关推荐
Chris _data6 天前
WPF 学习第三天 — Modbus RTU 串口通信
hadoop·学习·wpf
布吉岛的石头7 天前
Java 程序员第 43 阶段05:微服务整合大模型,跨服务调用架构设计实战,Seata分布式事务实战
wpf
步步为营DotNet7 天前
基于.NET Aspire 实现云原生应用的高效监控与可观测性
云原生·.net·wpf
芒鸽7 天前
HarmonyOS 分布式开发实战:设备协同、数据共享与跨设备迁移
分布式·wpf·harmonyos
Volunteer Technology7 天前
Flink状态管理与容错(二)
大数据·flink·wpf
happyprince8 天前
07_verl-Trainer模块详解
人工智能·架构·wpf·强化学习
bugcome_com8 天前
WPF + Prism 技术指南与实战项目(二、模板搭建)
wpf
小满Autumn8 天前
log4net 日志框架 — 从配置到实战速查手册
笔记·c#·.net·wpf·上位机·log4net
政沅同学9 天前
基于 C# WPF + HALCON 的工业视觉算法工具框架(开源)
开发语言·c#·wpf
happyprince9 天前
03_verl-设计理念与核心原理
wpf