【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界面的一个教程。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【C#】获取"我的电脑"的名字,如This PC、这台计算机
原文: 【C#】获取"我的电脑"的名字,如This PC、这台计算机 注意:这里获取的【我的电脑】的名字,不是机器的名字。如图所示: 要获取的是This PC这个字符串。 ------------------------------------------------------------------- 机器的名字可以通过系统属性查看,叫做Computer Name,如下图: 我的就是cn-c-w-725,如果想获取这个字符串直接调用Environment.MachineName就行了。 1.定义ShellAPI类 public static class ShellAPI { public const int MAX_PATH = 260; public const uint CMD_FIRST = 1; public const uint CMD_LAST = 30000; public const int S_OK = 0, S_FALSE = 1; public const int DRAGDROP_S_DROP = 0x00040100; public const int D...
- 下一篇
【C#】VS2012+InstallShield2013制作软件更新包
原文: 【C#】VS2012+InstallShield2013制作软件更新包 上篇文章介绍了如何使用installshield制作软件的安装包,见地址:http://blog.csdn.net/catshitone/article/details/41700115 这次来介绍一下,当软件有更新时,如何制作一个更新包,自动删除旧软件,安装新软件。 1.首先打开你的安装部署项目。 我的是Setup1.的General Information文件,如我左边圈住的有三个重要的项,如下图。 Product Version:你本次产品的版本号,每次发布新产品,这个的Version号,要增加一下。我上次的版本是1.02,所以这次我设置为1.03. Product Code:这就是一个guid,相当于产品的唯一识别码,每一次发布新版本,这个就要改变一下,可点击该行右边的{...}按钮进行随机分配。 Upgrade Code:这个是产品的升级码,同一个产品共用一个升级码,这里要保持不变。就像所有的vs2010都用的同一个Upgrade Code,每此vs2010有update,它只是改的Product...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- 2048小游戏-低调大师作品
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8