您的位置:首页 > 其它

WPF第二篇Button--事件实现原理,多边形Button,阴影效果

2013-09-24 23:18 429 查看
了解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);
}
}

[/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点半前后,蛮累的还,所以就用现成的代码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: