5.依赖属性

依赖属性是一种由 DependencyProperty 类管理的属性,通过注册机制将属性与元数据(Metadata)关联,允许属性值由多个来源(如本地值、样式、数据绑定、动画等)共同决定,并支持复杂的属性逻辑。

以下是一个简单的例子

 

首先一个自定义控件

 控件的XAML代码

<UserControl x:Class="WpfDependencyPropertyExample.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="120" d:DesignWidth="300">
    <Grid>
        <Border BorderThickness="1" 
                BorderBrush="#E0E0E0" 
                CornerRadius="8" 
                Margin="10" 
                Padding="15">
            <StackPanel>
                <!-- 显示依赖属性值的文本块 -->
                <TextBlock x:Name="DisplayTextBlock" 
                           FontSize="14" 
                           Foreground="#2D3748" 
                           FontWeight="Medium"/>

                <!-- 分隔线 -->
                <Rectangle Height="1" 
                           Fill="#E5E7EB" 
                           Margin="0 10"/>

                <!-- 说明文本 -->
                <TextBlock Text="这是一个依赖属性演示控件" 
                           FontSize="12" 
                           Foreground="#6B7280"/>
            </StackPanel>
        </Border>
    </Grid>
</UserControl>
    

控件的cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfDependencyPropertyExample
{
    /// <summary>
    /// 自定义用户控件,演示WPF依赖属性
    /// </summary>
    public partial class MyUserControl : UserControl
    {
        // 注册依赖属性:MyDependency
        // 所有者类型:当前控件类型
        // 属性类型:字符串
        // 包含默认值和属性变更回调
        public static readonly DependencyProperty MyDependencyProperty =
            DependencyProperty.Register(
                "MyDependency",          // 依赖属性名称
                typeof(string),          // 属性数据类型
                typeof(MyUserControl),   // 依赖属性所有者
                new PropertyMetadata(
                    "默认值",            // 默认值
                    OnMyDependencyPropertyChanged  // 值变更时的回调方法
                )
            );

        // CLR属性包装器,用于访问依赖属性
        public string MyDependency
        {
            get => (string)GetValue(MyDependencyProperty);
            set => SetValue(MyDependencyProperty, value);
        }

        // 依赖属性变更时的处理方法
        private static void OnMyDependencyPropertyChanged(
            DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // 将依赖对象转换为当前控件类型
            MyUserControl control = (MyUserControl)d;
            // 更新UI显示
            control.UpdateDisplayText(e.NewValue);
        }

        // 更新显示文本的私有方法
        private void UpdateDisplayText(object newValue)
        {
            DisplayTextBlock.Text = $"当前值:{newValue}";
            // 可选:添加值变更时的动画效果
            DisplayTextBlock.BeginAnimation(
                OpacityProperty,
                new System.Windows.Media.Animation.DoubleAnimation(1, 0.8,
                    new Duration(TimeSpan.FromMilliseconds(200))));
        }

        /// <summary>
        /// 控件构造函数,初始化组件
        /// </summary>
        public MyUserControl()
        {
            InitializeComponent();
            // 初始化时设置默认显示
            UpdateDisplayText(MyDependency);
        }
    }
}

主窗体代码

 XAML

<Window x:Class="WpfDependencyPropertyExample.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:WpfDependencyPropertyExample"
        mc:Ignorable="d"
        Title="WPF依赖属性演示" Height="300" Width="400">
    <Grid Margin="20">
        <!-- 自定义控件实例 -->
        <local:MyUserControl x:Name="userControlDemo" 
                             Margin="0 0 0 30"/>

        <!-- 操作按钮 -->
        <Button Content="更新依赖属性值" 
                Click="ChangeValueButton_Click" 
                Padding="10 6" 
                FontSize="14" 
                HorizontalAlignment="Left" VerticalAlignment="Bottom"/>
    </Grid>
</Window>
    

CS

using System;
using System.Windows;

namespace WpfDependencyPropertyExample
{
    /// <summary>
    /// 主窗口,演示依赖属性的使用和数据绑定
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 主窗口构造函数,初始化组件
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();
            // 初始化时设置初始值(可选演示)
            userControlDemo.MyDependency = "初始值 - " + DateTime.Now;
        }

        /// <summary>
        /// 按钮点击事件:修改依赖属性值
        /// </summary>
        private void ChangeValueButton_Click(object sender, RoutedEventArgs e)
        {
            // 生成带时间戳的新值
            string newValue = $"更新于:{DateTime.Now:yyyy-MM-dd HH:mm:ss}";
            // 通过两种方式设置依赖属性值
            userControlDemo.MyDependency = newValue;  // 直接赋值
            // 或者使用SetValue方法:
            // userControlDemo.SetValue(MyUserControl.MyDependencyProperty, newValue);
        }
    }
}

 

posted @ 2025-04-17 18:17  灰色淡季  阅读(47)  评论(0)    收藏  举报