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

了解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点半前后,蛮累的还,所以就用现成的代码了。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值