【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的

初学WPF,知道一些控件可以通过定义Style的Trigger改变要显示的样式,但是经常遇到一些明明Trigger已经触发了,但是里面Setter设置的样式,却没有效果的问题。其实主要原因,是样式重复定义导致的。

举个例子:

<Border x:Name="borderQZone" BorderBrush="Cyan" BorderThickness="0" CornerRadius="2,2,2,2" Width="20" Height="20" Style="{DynamicResource BorderStyle1}" >
              <Border.Resources>
                                    <Style x:Key="BorderStyle1" TargetType="{x:Type Border}">
                                        <Style.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter Property="BorderThickness" Value="5"></Setter>
                                                <Setter Property="BorderBrush" Value="Red"></Setter>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Resources>
                                <StackPanel>
                                    <Image x:Name="imgQzone" Width="20" Height="20" Source="Images/qzone.png" MouseLeftButtonDown="imgQzone_MouseLeftButtonDown"/>
 
                                </StackPanel>
                            </Border>

这段代码,执行后,无论你鼠标在上面经过多少次,外观样式都不会有任何改变。这是因为你在最外层的Border里已经定义了BorderBrush和BroderThickness,所以Trigger中的那两个setter不会起到任何作用,但是如果你在添加一个setter,Property设置为背景色。重新运行,你会发现这个Setter却有作用,就是因为我们在外层的Border标签中,没有定义Background属性,所以它才会有作用。

所以,到这里你应该知道如何更改你的代码了,如下:

<Border Width="50" Height="50" Style="{DynamicResource BorderStyle2}">
                <Border.Resources>
                    <Style x:Key="BorderStyle2" TargetType="{x:Type Border}">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="BorderBrush" Value="Black"></Setter>
                                <Setter Property="Background" Value="Green"></Setter>
                                <Setter Property="BorderThickness" Value="6"></Setter>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="False">
                                <Setter Property="BorderBrush" Value="Blue"></Setter>
                                <Setter Property="Background" Value="Yellow"></Setter>
                                <Setter Property="BorderThickness" Value="8"></Setter>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Border.Resources>
            </Border>

另外,还需要注意,一旦定义了IsMouseOver为True的Trigger,也最好定义一个为False的Trigger。经实践,如果只定义一个为True的,还是没有任何现实效果。


在接下的博客中,会为大家带来一个用WPF做的仿QQ界面的一个教程。




  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值