WPF样式:WPF多触发器和多数据触发器

我们用触发(trigger)来得到动态样式(dynamic styles)。到目前为止它们都基于大一属性来触发动画。WPF其实也支援多重触发:检测多个属性,在每个被检测属性的条件被满足后再触发动画。
多重触发可分为两种:即MultiTrigger,它与一般Trigger一样,应用于依附属性(dependency property).另一个则为MultiDataTrigger,它可以绑定(binding)于任何属性种类。让我们以一个简单例子来示范运用于MultiTrigger

多重触发(MultiTrigger)

<Window x:Class="_005多重触发_MultiTrigger_.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBox VerticalAlignment="Center" HorizontalAlignment="Center" Text="Hover and focus here" Width="200">
            <TextBox.Style>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsKeyboardFocused" Value="True"></Condition>
                                <Condition Property="IsMouseOver" Value="True"></Condition>
                            </MultiTrigger.Conditions>
                            <MultiTrigger.Setters>
                                <Setter Property="Background" Value="Red"></Setter>
                                <Setter Property="FontSize" Value="18"></Setter>
                            </MultiTrigger.Setters>
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
    </Grid>
</Window>

在这个例子,我们利用触发来让TextBox在同时拥有键盘焦点和鼠标移至其上时改变其背景颜色,如截图所示。这个触发需要满足两个条件,但我们可以应需求轻易地再增加更多条件。在Setters部分,我们设定当所有条件被满足后数值需要做出变动的属性:背景颜色。

多重数据触发(MultiDataTrigger)

正如一般的DataTrigger,MultiDataTrigger 也很酷,因为它利用绑定来检测一个属性。这意味着您可以利用所有很酷的WPF绑定技巧,当中包括绑定其他控件的属性等等

<Window x:Class="_006多重数据触发_MultiDataTrigger_.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <CheckBox x:Name="cbSampleYes" Content="Yes"></CheckBox>
        <CheckBox x:Name="cbSampleSure" Content="I'm sure"></CheckBox>
        <TextBlock HorizontalAlignment="Center" Margin="0 20 0 0" FontSize="28">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Setter Property="Text" Value="Unverified"> </Setter>
                    <Setter Property="Foreground" Value="Red"></Setter>
                    <Style.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=cbSampleYes,Path=IsChecked}" Value="True"></Condition>
                                <Condition Binding="{Binding ElementName=cbSampleSure,Path=IsChecked}" Value="True"></Condition>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Text" Value="Verified"></Setter>
                            <Setter Property="Foreground" Value="Green"></Setter>
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </StackPanel>
</Window>

在这里插入图片描述
在这里插入图片描述
在这个例子,我复用先前DataTrigger的例子。不过与其只是绑定一个属性,我绑定两个控件里同样的属性(IsChecked)。这让我们可以在两个复选框(CheckBox)被选定后才触动相关的样式 - 如果任何一个复选框的选定被移除,默认的样式则会被应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值