WPF 样式触发器

本文介绍了WPF样式触发器的使用,包括属性触发器,当属性值满足特定条件时执行Setter;数据触发器,允许基于任何.NET属性触发样式改变,而不局限于依赖属性;以及尚未详述的事件触发器,用于更复杂的逻辑表达。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

触发器

1.属性触发器

当某属性有一特定值,属性触发器执行一个Setter。当属性失去这个值时,属性触发器重做该Setter。

<StackPanel.Resources>
    <!-- 通过Style的属性触发器改变按钮鼠标经过样式 -->
    <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
        <Style.Triggers>
            <!-- 按钮鼠标经过 -->
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="RenderTransform">
                    <Setter.Value>
                        <RotateTransform Angle="10"/>
                    </Setter.Value>
                </Setter>
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
        </Style.Triggers>
        <!-- 正常样式 -->
        <Setter Property="Width" Value="50"/>
        <Setter Property="Height" Value="50"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Background" Value="BurlyWood"/>
    </Style>
            
    <!-- 通过Style的属性触发器改变绑定验证规则失败时文本框样式 -->
    <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <!-- 文本框绑定内容验证失败 -->
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="Background" Value="Red"/>
                <!-- 通过RelativeSource获取任何应用了此样式的元素的ErrorContent -->
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                    Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
        <!-- 正常样式 -->
        <Setter Property="Background" Value="Azure"/>
    </Style>
</StackPanel.Resources>

<Button Name="but" Style="{StaticResource buttonStyle}">Button</Button>
<TextBox Name="txt" Style="{StaticResource textBoxStyle}">
    <TextBox.Text>
        <Binding ElementName="but" Path="Content">
            <!-- 绑定自定义验证规则 -->
            <Binding.ValidationRules>
                <local:JpgValidation/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>


2.数据触发器

同属性触发器,但数据触发器可由任何.NET属性触发意外,而非仅由依赖属性触发。

<StackPanel.Resources>
    <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <!-- 当文本框值为disabled时,设置文本框不可用 -->
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="disabled">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
        <!-- 用输入值设置文本框背景色 -->
        <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
    </Style>
</StackPanel.Resources>

3.事件触发器

建设中...

 

4.用触发器表示更多的复杂逻辑

<StackPanel.Resources>            
    <Style x:Key="textBoxStyle2" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <!-- 逻辑或,当鼠标经过或获取焦点,设置前景色为红 -->
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="Red"/>
            </Trigger>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="Foreground" Value="Red"/>
            </Trigger>
                    
            <!-- Trigger变体 -->
            <MultiTrigger>
                <!-- 逻辑且,当鼠标经过且获取焦点,设置背景色为绿 -->
                <MultiTrigger.Conditions>
                    <Condition Property="IsMouseOver" Value="True"/>
                    <Condition Property="IsFocused" Value="True"/>
                </MultiTrigger.Conditions>
                <Setter Property="Background" Value="Green"/>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
</StackPanel.Resources>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值