WPF 依赖属性和附加属性区别

本文介绍了WPF中依赖属性的应用场景,包括样式设置、数据绑定等,并解释了附加属性的概念及其应用场景。

1、依赖属性

依赖属性:自己没有值,通过绑定的数据源 来获取值,依赖别人来传值,依赖属性的对象称为依赖对象。

几种应用依赖属性的场景:

1. 希望可在样式中设置属性。

2. 希望属性支持数据绑定。

3. 希望可使用动态资源引用设置属性。

4. 希望从元素树中的父元素自动继承属性值。

5. 希望属性可进行动画处理。

6. 希望属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。

7. 希望使用已建立的、WPF 进程也使用的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。

依赖对象创建时并不包含存储数据空间。WPF中必须使用依赖对象作为依赖属性的宿主。

 <StackPanel>
            <TextBox x:Name="txtbox1" Text="{Binding Title1,Mode=TwoWay}"/>
            <TextBox x:Name="txtbox2" Text="{Binding Title2,Mode=TwoWay}"/>
        </StackPanel>

2、附加属性

附加属性就是自己没有这个属性,在某些上下文中需要就被附加上去。比如TextBox的Grid.Row属性,如果我们定义TextBox类时定义一个Row属性是没有意义的,因为我们并不知道一定会放在Grid里,这样就造成了浪费。

       <TextBox Grid.Row="1"></TextBox>
        <TextBox Grid.Row="2"></TextBox>

### WPF依赖属性附加属性区别WPF 中,**依赖属性(Dependency Property)** **附加属性(Attached Property)** 都是基于 `DependencyObject` 的特性来实现的,但它们在设计目的使用场景上有显著差异。 #### 依赖属性(Dependency Property) 依赖属性是一种由 `DependencyObject` 支持的属性系统,它提供了许多高级功能,如数据绑定、样式、动画支持、默认值、元数据等。依赖属性通过调用 `DependencyProperty.Register` 方法注册到类中,并且可以通过 `GetValue` `SetValue` 方法进行访问设置[^2]。 依赖属性的一个关键特征是它能够在运行时动态地参与 WPF属性系统,例如: - 数据绑定:允许属性值来自其他对象的数据。 - 样式(Style):支持通过样式统一控制 UI 元素的外观。 - 动画:支持对属性值进行动画处理。 - 属性继承:某些依赖属性可以在逻辑树中向下传播给子元素。 示例代码如下: ```csharp public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(string), typeof(MyClass), new PropertyMetadata(default(string))); public string MyProperty { get { return (string)GetValue(MyPropertyProperty); } set { SetValue(MyPropertyProperty, value); } } ``` #### 附加属性(Attached Property) 附加属性是一种特殊的依赖属性,用于在不修改目标对象类定义的情况下为其添加额外的状态信息。它通常用于布局管理器或行为扩展中,例如 `Grid.Row` 或 `Canvas.Left` 等属性[^5]。 附加属性通过 `DependencyProperty.RegisterAttached` 方法注册,并提供静态的 `SetXXX` `GetXXX` 方法供外部调用: ```csharp public static readonly DependencyProperty MyAttachedPropertyProperty = DependencyProperty.RegisterAttached("MyAttachedProperty", typeof(string), typeof(MyClass), new PropertyMetadata(default(string))); public static void SetMyAttachedProperty(UIElement element, string value) { element.SetValue(MyAttachedPropertyProperty, value); } public static string GetMyAttachedProperty(UIElement element) { return (string)element.GetValue(MyAttachedPropertyProperty); } ``` XAML 使用方式如下: ```xml <TextBox local:MyClass.MyAttachedProperty="Hello" /> ``` #### 主要区别总结 | 特性 | 依赖属性 | 附加属性 | |------|----------|----------| | 注册方式 | 使用 `Register` 方法 | 使用 `RegisterAttached` 方法 | | 定义者 | 定义属性的类本身 | 外部类为其他类添加属性 | | 访问方式 | 实例方法(`GetValue`/`SetValue`) | 静态方法(`SetXXX`/`GetXXX`) | | 使用场景 | 控件内部状态管理、样式绑定等 | 布局、行为扩展、跨类共享信息 | | XAML 表达方式 | 普通属性语法 | `{Type.Property}` 形式(如 `Grid.Row`) | #### 相关机制支持 WPF依赖属性系统还支持多种操作方法,如 `SetValue`、`SetCurrentValue` `ClearValue`,这些方法可以影响属性值的优先级链。例如,`SetCurrentValue` 可以临时更改属性值而不覆盖其原始来源(如样式或绑定)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值