WPF第二篇Button--事件实现原理,多边形Button,阴影效果
2013-09-24 23:18
429 查看
了解WPF的事件驱动原理有助于我们深入理解WPF。
该内容是自己看书得到的结论,尚未向高手请教验证。
按下一个Button,触发相应事件。其实现源于C#语法中的委托delegate。delegate在C或者C++中就相当于函数指针,不同的是函数指针指向一个函数,而在C#中delegate指向的是一组具有相同返回值和参数的函数。当调用该委托时,其指向的一系列的函数都会被调用,这是其实现基础。下面举例说明。
public class TrafficLight
{
[/code]
也就是说,信号灯类里面有一个委托OnColorChange,在ColorChange()中将会调用此委托;将汽车类中有一个函数LightColorChange(),将之加入委托OnColorChange中,这样,当信号灯的颜色发生改变时,会调用ColorChange(),此函数内部又会调用委托OnColorChange,OnColorChange中含有Car的LightColorChange();这样一串下来,由信号灯的改变,引起汽车的操作。
同样的,一个鼠标事件中的一个委托,添加了Button的Click函数,鼠标事件在该Button上发生时,自然就会调用Button的Click函数。
绘制多边形Button
使用Button控件,在Visual Studio的XAML设计界面中拖出一个Button即可,但通常我们会根据我们软件的设计风格来定制我们自己的Button的颜色啊,悬停效果啊,形状啊等等。
下面讲自己绘制一个多边形Button并设置一些效果。
效果如图
看代码
分层看,Button,里面设置Button.Template属性,这个属性就是一个Template,而Template又包含一个用于显示的Grid,一个用于设置悬停效果的触发器Trigger,层次结构搞清楚了剩下就是考英文水平了。其中Polygon是一个五边形,这个就是按钮的轮廓,label用于显示按钮上的文字。
接下来是一个带有阴影效果的Button,阴影效果主要是使界面看起来不是那么二维。效果如图
代码
分析层次,Border绘制边框,设置一个属性Effect,这是阴影部分。Button作为Border的内部填充。这个Button也使用了自定义样式,由一个矩形作为背景,一个图片做图标,一个Label做文字提示。图片最好用PNG或者gif,这种图片背景为透明的,因此图片中间抠去的部分会显示背景颜色。
今天就到这了,今天的东西都是最近做项目用到的,每天早上六点起床去上班,到公司要9点,晚上回到学校差不多要9点半前后,蛮累的还,所以就用现成的代码了。
该内容是自己看书得到的结论,尚未向高手请教验证。
按下一个Button,触发相应事件。其实现源于C#语法中的委托delegate。delegate在C或者C++中就相当于函数指针,不同的是函数指针指向一个函数,而在C#中delegate指向的是一组具有相同返回值和参数的函数。当调用该委托时,其指向的一系列的函数都会被调用,这是其实现基础。下面举例说明。
public class TrafficLight
{
public class TrafficLight { private bool color = false; public bool Color{get {return color;}} public event LightEventHandler OnColorChange; public voidChangeColor() { color=!color; if(OnColorChange!=null) OnColorChange(color); } }
[/code]
class Car { private bool bRun = true; public void Enter(TrafficLight light) { light.OncolorChange+=LightColorChange; } public virtual void LightColorChange(bool color) { if(bRun && color) { bRun = false; } else if(!bRun && !color) { bRun = true; } } } TraffiLight light = new TrafficLight(); Car car = new Car(); car.Enter(light); light.ChangeColor(); light.ChangeColor();
也就是说,信号灯类里面有一个委托OnColorChange,在ColorChange()中将会调用此委托;将汽车类中有一个函数LightColorChange(),将之加入委托OnColorChange中,这样,当信号灯的颜色发生改变时,会调用ColorChange(),此函数内部又会调用委托OnColorChange,OnColorChange中含有Car的LightColorChange();这样一串下来,由信号灯的改变,引起汽车的操作。
同样的,一个鼠标事件中的一个委托,添加了Button的Click函数,鼠标事件在该Button上发生时,自然就会调用Button的Click函数。
绘制多边形Button
使用Button控件,在Visual Studio的XAML设计界面中拖出一个Button即可,但通常我们会根据我们软件的设计风格来定制我们自己的Button的颜色啊,悬停效果啊,形状啊等等。
下面讲自己绘制一个多边形Button并设置一些效果。
效果如图
看代码
<Button> <Button.Template> <ControlTemplate TargetType="Button"> <Grid> <Polygon Name="p" Points="0,0 211,0 211 50 105,73 0,50" Fill="#FF04599a"/> <Label Content="登 陆" Foreground="White" FontSize="30" Margin="61,0,0,31"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="p" Property="Fill" Value="#FF2479ba"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Button.Template> </Button>
分层看,Button,里面设置Button.Template属性,这个属性就是一个Template,而Template又包含一个用于显示的Grid,一个用于设置悬停效果的触发器Trigger,层次结构搞清楚了剩下就是考英文水平了。其中Polygon是一个五边形,这个就是按钮的轮廓,label用于显示按钮上的文字。
接下来是一个带有阴影效果的Button,阴影效果主要是使界面看起来不是那么二维。效果如图
代码
<Border> <Border.Effect> <DropShadowEffect Color="Gray" BlurRadius="16" ShadowDepth="3" Opacity="0.3" Direction="0" /> </Border.Effect> <Button Width="247" Height="161"> <Button.Template> <ControlTemplate> <Grid> <Rectangle Width="247" Height="161" Fill="White" Stroke="#FFa2a2a2"/> <Image Source="functions\icon_newspaper.gif" Height="39" Width="48"/> <Label Content="普通患者入组" Foreground="#FF648ebc" FontWeight="Bold" Margin="84,102,80,33"/> </Grid> </ControlTemplate> </Button.Template> </Button> </Border>
分析层次,Border绘制边框,设置一个属性Effect,这是阴影部分。Button作为Border的内部填充。这个Button也使用了自定义样式,由一个矩形作为背景,一个图片做图标,一个Label做文字提示。图片最好用PNG或者gif,这种图片背景为透明的,因此图片中间抠去的部分会显示背景颜色。
今天就到这了,今天的东西都是最近做项目用到的,每天早上六点起床去上班,到公司要9点,晚上回到学校差不多要9点半前后,蛮累的还,所以就用现成的代码了。
相关文章推荐
- 【leetcode】Decode Ways
- OCP-1Z0-053-V12.02-197题
- 字符串匹配的KMP算法
- 函数调用反汇编
- 关于NetApp: Data Ontap 7 mode 和cluster mode
- 【Android基础入门〖13〗】Gallery
- IOS cocos2d学习笔记-<八>游戏关卡(Objective-C文件读写)
- Oracle创建表空间
- Humble Numbers USCAO chapter 3.1
- 正则表达式
- toj3479 Selfish Grazing
- 如何诊断 job 执行失败
- libaio under MIPS architecture /在mips架构下使用的libaio
- Android Studio使用教程(二)
- 上传下载中文乱码问题的解决
- Android Studio使用教程(一)
- 防查询语句注入漏洞攻击
- 手势识别
- underscore--之function篇
- 老手是如果教新手写程序的