WPF 行为

WPF 行为

一、前言

行为是一类事物的共同特征,可以向用户界面控件添加功能,而无需将其子类化。 功能是在行为类中实现的,并附加到控件上,就像它本身就是控件的一部分。

比如在鼠标进入/离开控件时,表现出不同的现象;给TextBox添加水印等

二,实例

我们现在创建一个Button行为,当鼠标进入时,将按键放大并添加与阴影,以实现浮动效果,离开时,复原

1. 创建一个类继承自Behavior

csharp 复制代码
public class MyButtonBehavior : Behavior<Button>

我们自定义的行为需要继承自Behavior,并且需要指定该行为所用于的控件类型 ,该例子指定的关联对象类型为Button

2. 重写方法OnAttached()

在该方法中获取Button的宽和高,保存到字段中,并订阅Button的鼠标进入(MouseEnter)和鼠标离开事件(MouseLeave) AssociatedObject在这里就是所附加该行为的对象

在使用的过程中需要注意两点

  • 在自己实现的行为中,需要重写两个虚方法OnAttached() 和OnDetaching(),在行为附加和分离时会分别调用这两个方法
  • 在Behavior中有一个AssociatedObject的属性,该属性就是关联对象,也就是附加在控件对象
csharp 复制代码
public class MyButtonBehavior : Behavior<Button>
{

    private double m_Width;
    private double m_Hight;
    protected override void OnAttached()
    {
        base.OnAttached();

        //回去button的宽和高
        m_Width = AssociatedObject.Width;
        m_Hight = AssociatedObject.Height;

        AssociatedObject.MouseEnter += AssociatedObject_MouseEnter; 
        AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.MouseEnter -= AssociatedObject_MouseEnter;
        AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave;
    }

    private void AssociatedObject_MouseLeave(object sender, MouseEventArgs e)
    {
        Button btn = sender as Button;

        Storyboard storyboard = new Storyboard();

        DoubleAnimation daw = new DoubleAnimation();
        daw.Duration = TimeSpan.FromMilliseconds(100);
        daw.To = m_Width;

        DoubleAnimation dah = new DoubleAnimation();
        dah.Duration = TimeSpan.FromMilliseconds(100);
        dah.To = m_Hight;

        Storyboard.SetTarget(daw, btn);
        Storyboard.SetTargetProperty(daw, new PropertyPath("Width"));
        Storyboard.SetTarget(dah, btn);
        Storyboard.SetTargetProperty(dah, new PropertyPath("Height"));

        storyboard.Children.Add(daw);
        storyboard.Children.Add(dah);
        storyboard.Begin();

        btn.Effect = null;
    }

    private void AssociatedObject_MouseEnter(object sender, MouseEventArgs e)
    {
        Button btn = sender as Button;

        //设置动画
        Storyboard storyboard = new Storyboard();

        DoubleAnimation daw = new DoubleAnimation();
        daw.Duration = TimeSpan.FromMilliseconds(100);
        daw.To = m_Width * 1.2;

        DoubleAnimation dah = new DoubleAnimation();
        dah.Duration = TimeSpan.FromMilliseconds(100);
        dah.To = m_Hight *  1.2;

        Storyboard.SetTarget(daw, btn);
        Storyboard.SetTargetProperty(daw, new PropertyPath("Width"));
        Storyboard.SetTarget(dah, btn);
        Storyboard.SetTargetProperty(dah, new PropertyPath("Height"));

        storyboard.Children.Add(daw);
        storyboard.Children.Add(dah);
        storyboard.Begin();

        //设置阴影
        DropShadowEffect dropShadowEffect = new DropShadowEffect();
        dropShadowEffect.ShadowDepth = 1;
        dropShadowEffect.BlurRadius = 10;
        dropShadowEffect.Color = Color.FromRgb(221, 221, 221);
        btn.Effect = dropShadowEffect;
    }
}

安装NuGet包,Microsoft.Xmal.Behaviors.Wpf, 并在xaml界面引用命名空间 xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

csharp 复制代码
<Button Content="Clear"
        Margin="10 0 0 0"
        Width="100"
        Height="30">
    <i:Interaction.Behaviors>
        <local:MyButtonBehavior/>
    </i:Interaction.Behaviors>
</Button>

这样就实现了鼠标进入放大,鼠标离开恢复原样的效果

相关推荐
晚安苏州10 小时前
WPF DataTemplate 数据模板
wpf
甜甜不吃芥末1 天前
WPF依赖属性详解
wpf
Hat_man_1 天前
WPF制作图片闪烁的自定义控件
wpf
晚安苏州3 天前
WPF Binding 绑定
wpf·wpf binding·wpf 绑定
wangnaisheng3 天前
【WPF】RenderTargetBitmap的使用
wpf
dotent·3 天前
WPF 完美解决改变指示灯的颜色
wpf
orangapple5 天前
WPF 用Vlc.DotNet.Wpf实现视频播放、停止、暂停功能
wpf·音视频
ysdysyn5 天前
wpf mvvm 数据绑定数据(按钮文字表头都可以),根据长度进行换行,并把换行的文字居中
c#·wpf·mvvm
orangapple5 天前
WPF 使用LibVLCSharp.WPF实现视频播放、停止、暂停功能
wpf
晚安苏州5 天前
WPF ControlTemplate 控件模板
wpf