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>

在这里插入图片描述

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel wps中编码格式转换

EXCEL报表&#xff1a;另存为CSV格式&#xff0c;转换成UTF-8编码 - 简书 (jianshu.com) 经验证管用

Oracle数据库安全管理与数据加密技术

一、引言 数据安全性的重要性 在现代社会中&#xff0c;信息安全已经成为国家安全和企业安全的重要组成部分。随着人们对数字数据的使用越来越频繁&#xff0c;保护数字信息的安全性和完整性变得越来越重要。对于企业和个人用户来说&#xff0c;数据安全比任何时候都要重要&a…

Flask Python:如何获取不同请求方式的参数

目录 前言 1. 获取GET请求中的查询参数 2. 获取POST请求中的表单数据 3. 获取JSON数据 总结 前言 在使用Flask开发Web应用时&#xff0c;我们经常需要获取不同请求方式的参数。Flask提供了多种方式来获取不同请求方式的参数&#xff0c;包括GET请求中的查询参数、POST请求…

Node.js环境调用百度智能云(百度云)api鉴权认证三步走

方式一 :Postman脚本的方式生成v1版本的认证字符串 Postman脚本下载 下载Postman pre-request Script 设置 Authorization 示例脚本 方式二&#xff1a;在线签名工具生成 (试用于验证编程字符串签名是否有错误) 签名计算工具 https://cloud.baidu.com/signature/index.html …

postgis 建立路径分析,使用arcmap处理路网数据,进行拓扑检查

在postgresql+postgis上面,对路网进行打断化简,提高路径规划成功率。 一、创建空间库以及空间索引 CREATE EXTENSION postgis; CREATE EXTENSION pgrouting; CREATE EXTENSION postgis_topology; CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION postgis_tiger_geocoder;…

掌握机器学习新星:使用Python和Scikit-Learn进行图像识别

正文&#xff1a; 随着智能手机和社交媒体的普及&#xff0c;图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据&#xff0c;我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库&#xff0c;它…

elementui 左侧或水平导航菜单栏与main区域联动

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…

R语言数据挖掘:随机森林(1)

数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集&#xff0c;heart_learning.csv是训练数据集&#xff0c;heart_test.csv是测试数据集。要求&#xff1a;target和target2为因变量&#xff0c;其他诸变量为自变量。用决策树模型对target和target2做预测&#xf…

zookeeper监听集群节点的实现zkclient组件实现方案(Java版)

ZooKeeper Watcher 机制 client 向zookeeper 注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notification client 并发送一个WatchManager对象,然后client再更新该对象 package com.jacky.zk.demo;import org.I0Itec.zkclient.IZkChildListener;…

MacOS 14 搭建 PHP7.4 + Xdebug开发环境

摘要 项目使用的技术栈&#xff1a;PHP 7.4.33、ThinkPHP 5.1.27、Redis、MySQL 由于MacOS预装的PHP版本较高&#xff0c;所以需要降级 IDE 使用 PhpStorm 2023.2.3 1. 安装PHP 7.4.33 MacOS 14中的brew版本比较高&#xff0c;没有低版本的PHP brew install shivammathur/p…

如何保证缓存和数据库一致性----缓存双删

如何保证缓存和数据库的一致性 a.缓存双删&#xff1a;修改前删&#xff0c;修改后删&#xff0c;可以用aop去实现&#xff08;不能保证一致性&#xff09; b.或者根据业务场景去看&#xff0c;需不需要满足强一致性 c.对强一致性要求特别高需要加业务锁&#xff0c;只要有修改…

基于单片机的汽车尾灯控制系统设计

**单片机设计介绍&#xff0c;基于单片机的汽车尾灯控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车尾灯控制系统设计概要主要涵盖利用单片机技术实现对汽车尾灯的智能控制。下面将从系统构成、工作…

C++函数匹配机制

函数匹配 在大多数情况下&#xff0c;我们容易确定某次调用应该选用哪个重载函数。 然而&#xff0c;当几个重载函数的形参数量相等以及某些形参的类型可以由其他类型转换得来时&#xff0c;这项工作就不那么容易了。 以下面这组函数及其调用为例&#xff1a; void f(); vo…

013——超声波模块驱动开发(基于I.MX6uLL与SR04)

目录 一、 模块介绍 1.1 产品特色 1.2 产品实物图 1.3 接口定义 1.4 测距调节 1.5 模块工作原理 1.6 注意 二、 编码思路 三、 驱动程序 四、 应用程序 五、 Makefile 六、 其它及实验 一、 模块介绍 超声波测距模块是利用超声波来测距。模块先发送超声波&#xf…

gitlab代码迁移,包含历史提交记录、标签、分支

1、克隆现有的GitLab仓库&#xff08;http://localhost:8888/aa/bb/cc.git&#xff09;到本地&#xff0c;包括所有分支和标签 git clone --bare http://localhost:8888/aa/bb/cc.git 2、在gitlab上创建一个空的仓库&#xff08;http://localhost:7777/aa/bb/cc.git&#xff…

微服务连接不上rabbitmq解决

1.把端口port: 15672改成port&#xff1a;5672 2&#xff1a;virtual-host: my_vhost一定对应上

Android Studio 打开Logcat界面

在平时调试过程中查看调试日志需要打开 Android Studio Logcat界面。 每次安装AS都会忘记&#xff0c;自己备注一下。 AS->View->Tool Windows->Logcat

借助ChatGPT写作:打造学术论文中的亮点与互动

ChatGPT无限次数:点击直达 打造学术论文中的亮点与互动 引言 学术论文是学术界交流思想、探讨问题和展示研究成果的重要形式。如何使学术论文在众多作品中脱颖而出&#xff0c;吸引读者的眼球并激发互动&#xff0c;是每位研究者都关注的问题。本文将介绍如何借助ChatGPT这一…

redis-事务使用方法

一&#xff0c;redis-事务是否拥有原子性 Redis的单条命令是保证原子性的&#xff0c;但是redis事务不能保证原子性 Redis事务本质&#xff1a;一组命令的集合。----------------- 队列 set set set 执行 -------------------事务中每条命令都会被序列化&#xff0c;执行过…

C#面:.NET 中读写 XML 的类归属于哪些命名空间

在 .NET 中&#xff0c;读写 XML 的类主要归属于 System.Xml 命名空间。 该命名空间提供了一系列用于处理 XML 的类和接口&#xff0c;包括但不限于以下几个常用的类&#xff1a; XmlDocument&#xff1a;表示一个XML文档&#xff0c;可以用于加载、创建、修改和保存XML文档。…