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.的程序员6 小时前
服务治理与 API 网关:微服务流量管理的艺术
java·分布式·微服务·架构·wpf
Brianna Home12 小时前
【案例实战】鸿蒙分布式调度:跨设备协同实战
华为·wpf·harmonyos
c#上位机1 天前
wpf中Grid的MouseDown 事件无法触发的原因
c#·wpf
△曉風殘月〆1 天前
如何在WPF中实现ComboBox多选
wpf
csdn_aspnet2 天前
如何使用现有工具进行 .NET 8 迁移 Wpf
wpf·.net 8
123梦野2 天前
WPF——动画
wpf
攻城狮CSU2 天前
WPF 疑点汇总2.HorizontalAlignment和 HorizontalContentAlignment
wpf
c#上位机2 天前
wpf之命令
c#·wpf
没有bug.的程序员3 天前
分布式链路追踪:微服务可观测性的核心支柱
java·分布式·微服务·架构·wpf
Aevget3 天前
DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(一)
c#·wpf·界面控件·devexpress·ui开发