欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > WPF中的依赖属性

WPF中的依赖属性

2024/11/14 13:38:26 来源:https://blog.csdn.net/weixin_64532720/article/details/143598618  浏览:    关键词:WPF中的依赖属性

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);}}
}

结果如下:

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com