【WPF】OpacityMask作用于Button的一点体会

    前一阵在用WPF写一个硬件测试程序,想把界面做的漂亮一点(毛玻璃效果),在网上找了半天,结果发现了个OpacityMask这个属性,随之便研究了一下。发现了点意想不到的效果。使用此属性可以达到做网页时按钮hover改变背景图片的功能,而且使用的只是一张图片,不是两张图片。具体效果请看下图:


程序中使用到的按钮图片:1.       2. 

程序很简单,就是5个按钮。程序结构图如下:
================ 开发环境 ================系统: Win7 sp1 32位IDE: Microsoft Visual Studio 2015 Enterprise工程: .Net Framework 4.6=========================================

程序中涉及到了几个技术要点:

1. 按钮样式的绑定

2. 按钮自定义样式

3. 按钮自定义样式的触发条件设置

4. 参考文章: 

<<不透明遮罩概述>> https://msdn.microsoft.com/zh-cn/library/ms743320.aspx

具体程序如下所示:

 1 <Window.Resources>
 2         <SolidColorBrush x:Key="BackgroundColorAndText" Color="#2D2D30"/>
 3         <Style x:Key="NormalButton" TargetType="Button">
 4             <Setter Property="Width" Value="64"/>
 5             <Setter Property="Height" Value="64"/>
 6             <Setter Property="Margin" Value="5"/>
 7             <Setter Property="SnapsToDevicePixels" Value="True"/>
 8             <Setter Property="Background" Value="{StaticResource BackgroundColorAndText}"/>
 9         </Style>
10         <Style x:Key="NormalTextBlock" TargetType="TextBlock">
11             <Setter Property="VerticalAlignment" Value="Center"/>
12             <Setter Property="HorizontalAlignment" Value="Center"/>
13             <Setter Property="Foreground" Value="{StaticResource BackgroundColorAndText}"/>
14         </Style>
15     </Window.Resources>
16 <WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
17         <StackPanel>
18             <Button Style="{StaticResource NormalButton}">
19                 <Image Stretch="None" Source="Assets/Images/a.png"/>
20             </Button>
21             <TextBlock Style="{StaticResource NormalTextBlock}">贴图按钮</TextBlock>
22         </StackPanel>
23         <StackPanel>
24             <Button Style="{StaticResource NormalButton}">
25                 <Button.OpacityMask>
26                     <ImageBrush Stretch="None" ImageSource="Assets/Images/a.png"/>
27                 </Button.OpacityMask>
28             </Button>
29             <TextBlock Style="{StaticResource NormalTextBlock}">蒙板遮罩</TextBlock>
30         </StackPanel>
31         <StackPanel>
32             <Button Style="{StaticResource NormalButton}">
33                 <Button.OpacityMask>
34                     <ImageBrush Stretch="None" ImageSource="Assets/Images/a.png"/>
35                 </Button.OpacityMask>
36                 <Image Stretch="None" Source="Assets/Images/a.png"/>
37             </Button>
38             <TextBlock Style="{StaticResource NormalTextBlock}">贴图蒙板遮罩</TextBlock>
39         </StackPanel>
40         <StackPanel>
41             <Button Style="{StaticResource NormalButton}">
42                 <Button.Template>
43                     <ControlTemplate TargetType="Button">
44                         <Border x:Name="ButtonBorder" CornerRadius="3">
45                             <Image x:Name="Button4Image" Stretch="None" Source="Assets/Images/b.png"/>
46                         </Border>
47                         <ControlTemplate.Triggers>
48                             <Trigger Property="IsMouseOver" Value="True">
49                                 <Setter TargetName="ButtonBorder" Property="Background" Value="#1468A0"/>
50                             </Trigger>
51                             <Trigger Property="IsMouseOver" Value="True">
52                                 <Setter Property="OpacityMask">
53                                     <Setter.Value>
54                                         <ImageBrush Stretch="None" ImageSource="Assets/Images/b.png"/>
55                                     </Setter.Value>
56                                 </Setter>
57                             </Trigger>
58                             <Trigger Property="IsMouseOver" Value="True">
59                                 <Setter TargetName="Button4Image" Property="Source" Value="{x:Null}"/>
60                             </Trigger>
61                         </ControlTemplate.Triggers>
62                     </ControlTemplate>
63                 </Button.Template>
64             </Button>
65             <TextBlock Style="{StaticResource NormalTextBlock}">Hover变色</TextBlock>
66         </StackPanel>
67         <StackPanel>
68             <Button Style="{StaticResource NormalButton}">
69                 <Button.Template>
70                     <ControlTemplate TargetType="Button">
71                         <Border x:Name="ButtonBorder" CornerRadius="3" Background="{StaticResource BackgroundColorAndText}">
72                             <Image x:Name="Button4Image" Stretch="None" Source="Assets/Images/a.png"/>
73                         </Border>
74                         <ControlTemplate.Triggers>
75                             <Trigger Property="IsMouseOver" Value="True">
76                                 <Setter Property="OpacityMask">
77                                     <Setter.Value>
78                                         <ImageBrush Stretch="None" ImageSource="Assets/Images/a.png"/>
79                                     </Setter.Value>
80                                 </Setter>
81                             </Trigger>
82                             <Trigger Property="IsMouseOver" Value="True">
83                                 <Setter TargetName="Button4Image" Property="Source" Value="{x:Null}"/>
84                             </Trigger>
85                         </ControlTemplate.Triggers>
86                     </ControlTemplate>
87                 </Button.Template>
88             </Button>
89             <TextBlock Style="{StaticResource NormalTextBlock}">Hover变色</TextBlock>
90         </StackPanel>
91 </WrapPanel>

详细代码


5个按钮中第三个按钮[贴图蒙板遮罩]这个按钮是图片1和OpacityMask效果叠加产生的,具体能应用到的地方还未知,也许你能发现呢?
 
原博客: http://blog.csdn.net/xchicken 被盗,故换坑到此。
 
 
时间: 2024-10-11 23:20:44

【WPF】OpacityMask作用于Button的一点体会的相关文章

大型开放式网络课程MOOC的一点体会

2012年,美国的顶尖大学陆续设立网络学习平台,在网上提供免费课程,Coursera.Udacity.edX三大课程提供商的兴起,给更多学生提供了系统学习的可能.这就是大型开放式网络课程,即MOOC(massive open online courses).更多信息可参考百度百度http://baike.baidu.com/view/10187188.htm?from_id=8301540&type=search&fromtitle=MOOC&fr=aladdin 接触MOOC还是

关于项目管理的一点体会

关于项目管理的一点体会 enno | 时间: 2011-11-03 | 18,423 Views 设计管理 “1人100个月完成的项目,不是100个人1个月就可以完成.” 项目管理是让项目活动中相互竞争的各类制约因素:质量.进度.资源.风险等取得平衡的艺术,同时也是平衡项目干系人的各种需要.关注和期望,带领不同的人朝着相同目标迈进的领导艺术. 成功的项目管理可以简单理解为:按时.在预算内+满足产品需求+满足质量需求 地完成项目. 以下是我对项目管理的一点体会记录.————————————————

关于指针形参的一点体会

关于指针形参的一点体会: 现在假设指针实参为地址&a(0001)在这个&a(0001)地址空间内所存储的是一个int类型的变量为0: 那么在被调用函数中,会临时开辟一个空间一片临时地址空间&b(0002),在&b的所指向的地址空间内,其所存储的内容为一个地址值,这个地址值,就是&a(0001).所以现在在被调函数中,有两种变化的操作:1. 对&b(0002)所指向的地址内存储的内容,进行改变,比如讲将&b(0002)所指向空间内的值就是(0001)改

Delphi研究,对全局变量函数与OOP编程关系的一点体会 good

感叹:设计VCL的人真是神人啊,感觉比Pascal编译器的设计人还要牛很多,把整个Windows架构理了一遍,封装的如此之好,复用的如此之好(以至于Delphi的控件满天飞,使用还特别容易),简直惊为天人.难怪charles petzold当初觉得不可能用PASCAL语言做Windows编程(李维说的),以前我对这句话的理解是,Pascal语言本身达不到windows编程的要求,可能是因为他这方面的功力达不到(觉得可能是因为petzold对比anders的编译器功力相差太远,不知道编译器的许多细

【原创】C#玩高频数字彩快3的一点体会

购彩风险非常高,本人纯属很久以前对数字高频彩的一点研究.目前已经远离数字彩,重点研究足球篮球比赛资料库和赛果预测. 这是一篇在草稿箱保存了1年多的文章,一直没发现,顺便修改修改分享给大家.以后会有更多关于足球和篮球体育彩票的玩法分析,希望大家关注. 本人不算专业程序员,但经常敲代码玩玩.上学时研究的是伪随机数这个东东,因此对彩票就情有独钟,从10年开始,就开始研究双色球,其中软件版本改了又改,但一直没有实际操作过,原因就是双色球的投注量太大.所以这1年多就没研究了.最近一次偶然的机会,发现了“高

音频软件消除人声的一点体会(cood edit ,goldwav)

音频软件消除人声的一点体会(cood  edit ,goldwav) 使用方法: 1.打开文件 2.命令处理(红色位置可以调整到你认为合适的数据或效果) 3.效果:两个软件均处理后的效果均可以接受.不能完全消除人声,但能减到比较低. 至于网络上有说的一种用千千静听的消音插件,暂时没有试过....期待下次再测评.

android camera获取matrix作用于canvas的研究

网上查了一下相关的文章,认为自己看懂了,但是实际测试时和网上说的并不一样(后来研究发现,那个人写的是错的!!!),所以,在此提醒大家,要勇于质疑,勇于提出问题. 首先说明camera类,这个类位于package android.graphics 包下,用于图像3D变换,通过旋转.偏移等方式,最终通过getMatrix(Matrix)方法拿到矩阵,作用于canvas,使得画面呈现出立体效果. camera的源码没什么看的,这里列举他的主要方法: public native void save();

做android移动开发的一点体会

做手机的一点体会 整个android系统是一个完整的生态系统,谷歌提供开放的android平台,下游有各种生产硬件的厂家提供各种手机的硬件,像富士康这样的工厂提供手机的代加工, 然后是高通这样的公司提供手机的核心芯片和自己的解决方案,然后网上做手机的公司,相当于是做一个大的"集成",做手机的公司需要从各种运营商那里拿到订单,然后根据 运营商的需求来做手机,运营商卖好了手机,和手机公司之间分成,或者是 手机公司通过其他的渠道售卖自己的手机,功能要么是全网通,兼容各个运营商,要么是兼容某一

java_manual的一点体会

最近看了一下Alibaba的java_manual1.4,有了一点体会 学习差不离就是这样,编程不是一味的敲敲敲,查查查,有的东西不是看看别人写的博客案例就能明白的 有时就算可以解决问题,但对原理的了解却并不够 还是要去看看书 写项目也有一点体会,有时候总是不知道一个功能/方法命名什么好,怎样让整个项目的命名规范,至少让自己舒服 看这个手册还是有些用处的 不多说,记一点个人觉得不错的Java编码规范 16.[参考]各层命名规约: A) Service/DAO 层方法命名规约 1) 获取单个对象的