首页 > 其他分享 >WPF 行为

WPF 行为

时间:2023-05-31 20:46:15浏览次数:33  
标签:Storyboard AssociatedObject dah daw DoubleAnimation new WPF 行为

一、简介

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

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

二、使用

2.1 例:public class FloatBehavior : Behavior<Button>

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

2.2 在我们自己使用的过程中需要注意两点 

  1)在自己实现的行为中,需要重写两个虚方法OnAttached()OnDetaching(),在行为附加和分离时会分别调用这两个方法

  2)在Behavior中有一个AssociatedObject的属性,该属性就是关联对象,也就是附加在控件对象

2.3 最后应该时下面这个样子 (这是一个没有任何功能的行为)

public class FloatBehavior : Behavior<Button>
{
    protected override void OnAttached()
    {
        base.OnAttached();
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
    }
}

 三、举例

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

 实现思路:

  1.创建一个类继承自Behavior<Button>

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

  3.鼠标进入时,执行AssociatedObject_MouseEnter

  4.鼠标离开时,执行AssociatedObject_MouseLeave

  5.重写OnDetaching(),在该方法中取消事件订阅

实现代码:

public class FloatBehavior : 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:FloatBehavior/>
    </i:Interaction.Behaviors>
</Button>

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

 四、总结

  1.安装NuGet包,Microsoft.Xmal.Behaviors.Wpf

  2.创建行为类,并继承于Behavior<T>

  3.重新方法OnAttached()和OnDetaching()

  4.在该类中有一个关联对象AssociatedObject,也就是所附加该行为的对象,所有的逻辑都可根据该对象展开

标签:Storyboard,AssociatedObject,dah,daw,DoubleAnimation,new,WPF,行为
From: https://www.cnblogs.com/just-like/p/17426637.html

相关文章

  • WPF全局样式
    WPF全局样式Theme目录下建立Style.xaml文件  <ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><StyleTargetType="......
  • WPF窗体右上角叉叉退出应用程序
    WPF窗体右上角叉叉退出应用程序 WPF窗体右上角叉叉退出应用程序记得xaml里的Window标签响应Closing事件 privatevoidWindow_Closing(objectsender,System.ComponentModel.CancelEventArgse){if(MessageBox.Show("是否确认退出?","温......
  • WPF中的密码框
    WPF中的密码框XAML文件<PasswordBoxName="PasswordBox"Margin="5"Padding="5"PreviewKeyDown="Txtpassword_PreviewKeyUp"/> 后台代码:IntPtrp=System.Runtime.InteropServices.Marshal.SecureStringToBSTR(this.Password......
  • LYT-WPF-基础-布局-Canvas面板
    已亲测!ZIndex实例有修改之处!!!本文转自:WPF教程五:布局之Canvas面板-.NET开发菜鸟-博客园(cnblogs.com),感谢~~Canvas:画布面板画布,用于完全控制每个元素的精确位置。他是布局控件中最为简单的一种,直接将元素放到指定位置,主要来布置图面。使用Canvas,必须指定一个子元素的位置(相对......
  • LYT-WPF-基础-布局-WrapPanel面板
    已亲测!本文转自:WPF教程三:布局之WrapPanel面板-.NET开发菜鸟-博客园(cnblogs.com),感谢~~WrapPanel:环绕面板    WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够时就会自动调整进行换行,后续排序按照从上至下或从右至左的顺序进行。    ......
  • LYT-WPF-基础-布局-StackPanel面板
    已亲测!本文转自:WPF教程二:布局之StackPanel面板-.NET开发菜鸟-博客园(cnblogs.com),感谢~~应用程序界面设计中,合理的元素布局至关重要,它可以方便用户使用,并将信息清晰合理地展现给用户。WPF提供了一套功能强大的工具-面板(Panel),来控制用户界面的布局。你可以使用这些面板控件......
  • WPF RichTextBox 过滤中文不生效的问题
    WPFRichTextBox过滤中文不生效的问题1.问题使用系统自带的OnPreviewTextInput事件,过滤用户输入时,可以在OnPreviewTextInput中利用e.Handled=true过滤英文和数字等的输入,但是无法过滤中文字符的录入。2.解决方法不使用系统的PreviewTextInput事件,而是调用TextCompositionMa......
  • 最高院--当事人在催收通知签字并注明“收到”的行为不能解释成其已经同意还款;但仅签字
    (2020)最高法民申4676号  江西省金融资产管理股份有限公司、江西省进出口公司金融不良债权追偿纠纷再审审查与审判监督民事裁定书申请人主张:1.依据《最高人民法院关于超过诉讼时效期间借款人在催款通知单上签字或者盖章的法律效力问题的批复》,进出口公司签收《债务逾期催收通知......
  • 界面组件Telerik UI for WPF可轻松实现直方图,让数据可视化更简单
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。TelerikUIforWPF|下载试用TelerikUI......
  • 外汇交易中有这些行为绝对赚不到钱,赶紧看看你有没有
    在外汇交易中这些行为绝对影响赚钱,赶紧看下你有没有?一.平均化对交易者来说,适度的平均化在一段时间内是安全的,但他们最终肯定会亏损。不管在看涨的股市还是在外汇市场中,平均销售是特别危险的。二.不尊重本金外汇交易者认为只拿利润冒险,而不是自己的本金?相信事实并非如此。赚的......