WPF 行为

WPF 行为

一、前言

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

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

二,实例

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

1. 创建一个类继承自Behavior

public class MyButtonBehavior : Behavior<Button>

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

2. 重写方法OnAttached()

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

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

  • 在自己实现的行为中,需要重写两个虚方法OnAttached() 和OnDetaching(),在行为附加和分离时会分别调用这两个方法
  • 在Behavior中有一个AssociatedObject的属性,该属性就是关联对象,也就是附加在控件对象
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"

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

在这里插入图片描述

在这里插入图片描述

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

相关推荐

  1. WPF行为

    2024-04-04 06:52:01       54 阅读
  2. 网络安全-WAF如何判断是攻击行为

    2024-04-04 06:52:01       62 阅读
  3. WPF StackPanel

    2024-04-04 06:52:01       60 阅读
  4. WPF Border

    2024-04-04 06:52:01       57 阅读
  5. WPF RelativeSource

    2024-04-04 06:52:01       58 阅读
  6. WPF Grid

    2024-04-04 06:52:01       57 阅读
  7. WPF DataGrid

    2024-04-04 06:52:01       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 06:52:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 06:52:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 06:52:01       82 阅读
  4. Python语言-面向对象

    2024-04-04 06:52:01       91 阅读

热门阅读

  1. C++学习笔记(八)

    2024-04-04 06:52:01       33 阅读
  2. 个人推荐Redis比较好的一种使用规范

    2024-04-04 06:52:01       28 阅读
  3. Python语法总结:not(常出现错误)

    2024-04-04 06:52:01       37 阅读
  4. 如何开启MySQL的binlog日志

    2024-04-04 06:52:01       34 阅读
  5. Mac 如何彻底卸载Python 环境?

    2024-04-04 06:52:01       39 阅读
  6. ffmpeg Android 笔记

    2024-04-04 06:52:01       37 阅读
  7. springboot如何编写gitlabrunner的部署文件

    2024-04-04 06:52:01       32 阅读