WPF中的依赖属性

news/2024/11/14 2:30:52/

1.创建项目后下载两个NuGet程序包

 

 2.创建一个MyButton类继承Button

MyButton类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace WPF练习15依赖属性
{public class MyButton : Button{// 普通属性//public int CornerRadius { get; set; }// 依赖属性的包装器:其实就是一个普通属性// 依赖属性需要使用普通属性包装起来。public CornerRadius CornerRadius{get{return (CornerRadius)GetValue(CornerRadiusProperty);}set{SetValue(CornerRadiusProperty, value);}}/*a、依赖属性所属的类必须继承至DependencyObject类,b、依赖属性的声明开头默认 public static readonly,c、依赖属性的命名以Property结尾,建议:包装器名称+Propertyd、使用DependencyProperty.Register静态方法注册。e、Register方法的三个参数(1、依赖属性包装器的名字,2、依赖属性保存值得类型,3、指明依赖属性的宿主类型)*/public static readonly DependencyProperty CornerRadiusProperty =DependencyProperty.Register("CornerRadius",typeof(CornerRadius),typeof(MyButton),new PropertyMetadata(default(CornerRadius), CornerRadiusPropertyCallback));// 当CornerRadiusProperty依赖属性发生变化时,处理一些业务逻辑// d依赖对象,此依赖属性属于哪个控件?MyButtonprivate static void CornerRadiusPropertyCallback(DependencyObject d, DependencyPropertyChangedEventArgs e){MyButton button = (MyButton)d;button.Content = e.NewValue.ToString();}// 普通属性private Brush myBackground;public Brush MyBackground{get { return myBackground; }set{myBackground = value;OnBackgroundChanged();}}// 普通事件public event EventHandler BackgroundChanged;private void OnBackgroundChanged(){BackgroundChanged?.Invoke(this, EventArgs.Empty);}// 路由事件:  公开静态只读的 public static readonly,这一点和依赖属性类似// 需要使用RoutedEvent来定义public static readonly RoutedEvent MyClickEvent = EventManager.RegisterRoutedEvent("MyClick",RoutingStrategy.Bubble,  // 使用的路由策略:冒泡(从内层元素向外层元素执行)  直连(只执行本元素), 隧道(捕获,挖洞)// 路由事件使用的委托类型RoutedEventHandler public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);typeof(RoutedEventHandler),typeof(MyButton));// 路由事件的包装器,用一个普通事件来包装一下路由事件。public event RoutedEventHandler MyClick{add { AddHandler(MyClickEvent, value); }  // 添加事件remove { RemoveHandler(MyClickEvent, value); }  // 移除事件}// 设置一下MyClick事件的执行时机,在点击的执行// 调用MyBackground1ChangedEventprotected override void OnClick(){// 路由事件的参数对象。是哪一个路由事件的参数呢?RoutedEvent = MyClickEventRoutedEventArgs e = new RoutedEventArgs(){RoutedEvent = MyClickEvent,};this.RaiseEvent(e);  // 触发路由事件MyClickEvent}}
}

 3.创建MainWindowViewModel

 

 MainWindowViewModel代码如下:

using CommunityToolkit.Mvvm.ComponentModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;namespace WPF练习15依赖属性.ViewModels
{public class MainWindowViewModel: ObservableObject{private CornerRadius cornerRadius = new CornerRadius(10);public CornerRadius CornerRadius{get { return cornerRadius; }set { SetProperty(ref cornerRadius, value); }}}
}

 

MainWindow.xaml.cs代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WPF练习15依赖属性
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void myButton_BackgroundChanged(object sender, EventArgs e){MyButton myButton = (MyButton)sender;Console.WriteLine("修改了MyBackground属性");Console.WriteLine(myButton.MyBackground.ToString());}private void myButton_MyClick(object sender, RoutedEventArgs e){MessageBox.Show(e.RoutedEvent.Name);}}
}

结果如下:

 

 


http://www.ppmy.cn/news/1546316.html

相关文章

大数据新视界 -- 大数据大厂之 Impala 性能优化:为企业决策加速的核心力量(下)(14/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Linux环境基础开发工具的使用

Linux软件包管理器yum yum是一个软件下载安装管理的客户端&#xff0c;相当于手机上的应用商店 Linux中软件包可能存在依赖关系&#xff0c;而yum会帮我们解决依赖关系的问题 Linux系统&#xff08;centos&#xff09;的生态 安装软件的方式&#xff1a;源代码安装、rpm包安…

汇盈策略股票杠杆交易加仓超1000亿,大幅买入这些股票

查查配分析上周,A股市场反弹,上证指数、深证成指、创业板指分别累计上涨5.51%、6.75%、9.32%。在市场反弹的情况下,Wind数据显示,截至11月8日,A股市场融资余额报17944.52亿元,创2015年7月3日以来新高,上周融资余额增加1031.35亿元。 汇盈策略但凭借其优秀的业务模式和高效的运…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

【Linux】 IPC 进程间通信(三)(消息队列 信号量)

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 一、消息队列 &#x1f48c;…

sed awk 第二版学习(九)—— 高级主题

目录 一、getline 函数 1. 从输入数据流中读取 2. 从文件中读取 3. 将输入赋给一个变量 4. 从管道读取输入 二、close() 函数 三、system() 函数 四、基于菜单的命令生成器 五、直接向文件和管道输出 1. 直接输出到一个文件 2. 直接输出到一个管道 3. 处理多个文件…

ArkTS--应用状态

应用状态 应用状态相关的内容需要使用模拟器或真机调试&#xff0c;在API 11开始也支持preview 1.LocalStorage LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收参数可以在页面内共享数据 1.1 页面内共享数据 import {MyUser} from ../model/MyUser //用户对…

MySQL OnlineDDL添加字段

alter 添加字段 5.7 默认是algorithminplace以及locknone来进行DDL操作&#xff0c;但是添加列整个执行过程中也会部分涉及到Copy Table。 如果有碎片比较大&#xff0c;因为会copy表会碎片整理&#xff0c; 添加字段成功后有可能磁盘使用空间降低&#xff0c;添加过程中磁盘…