了解WPF的事件驱动原理有助于我们深入理解WPF。
该内容是自己看书得到的结论,尚未向高手请教验证。
按下一个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); } }
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点半前后,蛮累的还,所以就用现成的代码了。