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); } } }
浙公网安备 33010602011771号