wpf之依赖属性

前言

依赖属性由于它占用内存小的特点在wpf的自定义控件中得到了广泛应用,本文就来介绍wpf中依赖属性的用法。

1、自定义依赖属性

下面的代码使用 DependencyProperty.Register声明并注册了一个依赖属性,Register方法的4个参数含义如下:

1)属性名称

这里是IsHighlighted

2)属性的类型

IsHighlighted的类型是bool

3)属性所有者类型

IsHighlighted属性属于CustomButton类中的成员,所以为CustomButton

4)属性元数据

PropertyMetadata类型构造函数第一个参数为属性默认值可以设置为false,OnIsHighlightedChanged是属性值改变时的回调函数。

csharp 复制代码
   class CustomButton : Button
    {
        public CustomButton()
        {
            this.Background = new SolidColorBrush(Colors.Red);//初始化设置为红色
        }

        public static readonly DependencyProperty IsHighlightedProperty =
            DependencyProperty.Register(
                "IsHighlighted", // 属性的名称(与包装器一致)
                typeof(bool),    // 属性的类型
                typeof(CustomButton), // 属性所有者的类型(定义该属性的类)
                new PropertyMetadata( // 属性的元数据
                    false,           // 默认值
                    OnIsHighlightedChanged) // 属性值改变时的回调方法(可选)
            );

        // 2. 可选的属性值改变回调方法
        private static void OnIsHighlightedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // d 是属性值发生改变的那个对象CustomButton的实例)
            var control = (CustomButton)d;
            bool newValue = (bool)e.NewValue;
            bool oldValue = (bool)e.OldValue;

            // 在这里可以响应属性的变化,例如触发一些逻辑或重绘控件
            control.UpdateVisualState();
        }

        // 3. 标准的 CLR 属性包装器
        public bool IsHighlighted
        {
            get { return (bool)GetValue(IsHighlightedProperty); }
            set { SetValue(IsHighlightedProperty, value); }
        }

        private void UpdateVisualState()
        {
            // 根据 IsHighlighted 的值更新控件外观
            if (IsHighlighted)
            {
                this.Background = new SolidColorBrush(Colors.Green);//高亮状态逻辑
            }
            else
            {
                this.Background = new SolidColorBrush(Colors.Red);  // 普通状态逻辑

            }
        }
    }

2、声明一个ViewModelBase类

csharp 复制代码
 public class ViewModelBase
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propname));
            }
        }
    }

3、声明一个ViewModel类继承ViewModelBase

csharp 复制代码
 public  class ViewModel:ViewModelBase
    {
        private bool  isHighLight = false ;
        public bool IsHighLight
        {
            get
            {
                return isHighLight;
            }
            set
            {
                this.isHighLight = value;
                OnPropertyChanged("IsHighLight");
            }
        }
    }

4、窗体类

csharp 复制代码
 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }

5、xaml代码

下面的代码中CustomButton 的IsHighlighted作为依赖属性绑定了ViewModel中的IsHighLight属性;CheckBox 的IsChecked属性绑定了ViewModel中的IsHighLight属性;这样当我点击CheckBox的时候ViewModel中的IsHighLight属性会改变,IsHighLight属性改变又会改变CustomButton 的IsHighlighted属性,这样就能触发OnIsHighlightedChanged方法,该方法的作用是当IsHighlighted为true时,将CustomButton背景色改成绿色,否则改成红色。

csharp 复制代码
<Window x:Class="wpf之依赖属性.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf之依赖属性"
        mc:Ignorable="d"
        Title="依赖属性" Height="450" Width="800">
    <Grid>
        <StackPanel Orientation="Vertical"  >
            <local:CustomButton Height=" 100"  IsHighlighted="{Binding IsHighLight}"    />
            <CheckBox Height=" 100" IsChecked="{Binding  IsHighLight,Mode=TwoWay }"  />
        </StackPanel >
    </Grid>
</Window>

CheckBox 选中时的界面:

CheckBox 取消选中时的界面:

从这里的效果可以看出CustomButton 的IsHighlighted依赖属性已经成功应用了。

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》

2、《C#与PLC通信从入门到精通 》

3、《C# Modbus通信从入门到精通》

4、《C#Socket通信从入门到精通 》

5、《C# MES通信从入门到精通》

6、《winform控件从入门到精通》

7、《C#操作MySql数据库从入门到精通》

相关推荐
雨浓YN9 小时前
GKMLT通讯工具箱(WPF MVVM) - 07-倍福ADS通讯
网络·wpf
雨浓YN10 小时前
GKMLT通讯工具箱(WPF MVVM) - 04-三菱MC通讯
wpf
不会编程的懒洋洋13 小时前
WPF XAML+布局+控件
xml·开发语言·c#·视觉检测·wpf·机器视觉·视图
雨浓YN14 小时前
GKMLT通讯工具箱(WPF MVVM) - 06-OPCUA通讯
wpf
雨浓YN14 小时前
GKMLT通讯工具箱(WPF MVVM) - 03-西门子S7通讯
wpf
雨浓YN17 小时前
GKMLT通讯工具箱(WPF MVVM) - 05-WebAPI通讯
wpf
软泡芙2 天前
【WPF 】MVVM 设计模式在 WPF 中的实战应用
设计模式·wpf
张小俊_2 天前
WPF 跨线程 UI 更新与硬编码赋值引发的 Bug 排查
c#·bug·wpf
七夜zippoe3 天前
DolphinDB在工业物联网中的优势
物联网·wpf·工业物联网·优势·dolphindb
heimeiyingwang3 天前
【架构实战】观察者模式在分布式系统中的应用
观察者模式·架构·wpf