WPF属性

本文介绍了WPF中的两种关键属性——依赖属性和附加属性。依赖属性支持样式设置、数据绑定、继承、动画等功能,适用于需要属性变更通知、值继承和节省内存的场景。附加属性则用于非定义该属性的类,提供特殊依赖属性功能,常用于如Grid和Canvas等面板。文中通过实例展示了这两种属性的使用方法和特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WPF最常用的两种属性就属 依赖属性和附加属性。

一、依赖属性:依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值。依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。

将所有的属性都设置为依赖属性并不总是正确的解决方案,具体取决于其应用场景。有时,使用私有字段实现属性的典型方法便能满足要求。

应用依赖属性的场景:

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

2.支持数据绑定。

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

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

5.可进行动画处理。

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

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

依赖属性的特点:

1、属性变更通知:只要依赖属性的值发生改变,wpf就会自动根据属性的元数据触发一系列的动作,这些动作可以重新呈现UI元素,也可以更新当前的布局,刷新数据绑定等等

2、属性值继承:属性值自顶向下沿着元素树进行传递。

3、节省内存空间:依赖属性和CLR属性在内存的使用上是截然不同的,每个CLR属性都包含一个非static的字段,因此当我们实例化一个类型的时候,就会创建该类型所拥有的所有CLR属性,也就是说一个对象所占用的内存在调用new操作进行实例化的时候就已经决定了、而wpf允许对象在创建的时候并不包含用于存储数据的空间,只保留在需要用到数据的时候能够获得该默认值,即用其他对象数据或者实时分配空间的能力。

自定义依赖属性:

1、声明依赖属性变量。依赖属性的声明都是通过public static来公开一个静态变量,变量的类型必须是DependencyProperty
2、在属性系统中进行注册。使用DependencyProperty.Register方法来注册依赖属性,或者是使用DependencyProperty.RegisterReadOnly方法来注册
3、使用.NET属性包装依赖属性

<Grid >

        <Button Height="50" Width="80">按钮

            <Button.Style>

                <Style TargetType="Button">

                    <Style.Triggers>

                        <Trigger Property="IsMouseOver" Value="true">

                            <Setter Property="Foreground" Value="Yellow"/>

                            <Setter Property="FontSize" Value="20"/>

                        </Trigger>

                    </Style.Triggers>

                </Style>

            </Button.Style>

        </Button>

    </Grid>

二、附加属性:附加属性作用于支持附加属性的元素,它是由支持附加属性的父元素产出作业,支持附加属性的元素会继承所在的父元素的属性。

附加属性的特点:

1、特殊的依赖属性
2、用于非定义该属性的类 例如Grid面板的RowDefinition、ColumnDefinition、Canvas面板的Left、Right
DockPanel面板的Dock都是附加属性。

附加属性的定义:

1、声明数据属性变量。 public static 的DependencyProperty类型的变量。
2、在属性系统中进行注册,使用DependencyProperty.RegisterAttached()方法来注册,方法参数和注册依赖属性时Register()方法的参数一致。
3、调用静态方法设置和获取属性值。通过调用DependencyObject的SetValue()和GetValue()方法来设置和获取属性的值。
两个方法应该命名为SetPropertyName()方法和GetPropertyName()方法。

<Canvas>

        <Rectangle Canvas.Left="20" Canvas.Top="5" Width="50" Height="100" RadiusX="10" RadiusY="10" Fill="Red">

        </Rectangle>

        <Rectangle Canvas.Left="70" Canvas.Top="10" Width="50" Height="100" RadiusX="10" RadiusY="10" Fill="Orange">

        </Rectangle>

        <Rectangle Canvas.Left="121" Canvas.Top="15" Width="50" Height="100" RadiusX="10" RadiusY="10" Fill="Yellow">

        </Rectangle>

    </Canvas>

### WPF 中的 PropertyGrid 控件 在 WPF 开发中,`PropertyGrid` 是一种常用的控件,用于显示和编辑对象的各种属性。虽然标准的 WPF 并未提供内置的 `PropertyGrid` 控件,但可以通过第三方库或手动实现来满足需求。 #### 自定义依赖属性支持绑定 为了使自定义控件能够在 XAML 中被设置并支持数据绑定,可以为其添加依赖属性(Dependency Properties)。例如: ```csharp public class MyCustomControl : Control { public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( "MyProperty", typeof(string), typeof(MyCustomControl), new PropertyMetadata(default(string))); public string MyProperty { get => (string)GetValue(MyPropertyProperty); set => SetValue(MyPropertyProperty, value); } } ``` 上述代码展示了如何创建一个名为 `MyProperty` 的依赖属性[^1]。这使得该属性可以直接在 XAML 文件中声明,并与其他绑定机制无缝集成。 --- #### 实现 PropertyGrid 功能 如果需要在 WPF 应用程序中实现类似 Visual Studio 风格的对象属性编辑器,则可以选择以下几种方式之一: ##### 方法一:使用开源组件 一些开源项目提供了轻量级的 `PropertyGrid` 组件。例如,在 WinForms 中使用的 `PropertyGrid` 可以作为参考[^3]。然而需要注意的是,WinForms 版本的 `PropertyGrid` 不具备 WPF 所需的数据绑定能力,因此通常不推荐直接移植到 WPF 项目中。 对于纯 WPF 场景,开发者可能需要额外处理非依赖属性的支持逻辑。例如,当目标对象的某些属性不是依赖属性时,无法直接通过绑定完成初始化操作[^2]。此时可通过后台 C# 代码显式赋值解决此问题。 ##### 方法二:采用商业解决方案 DevExpress 提供了一款高质量的 WPF 属性网格控件——`WPF Property Grid`[^4]。这款控件不仅具有强大的功能集,还模仿了 Visual Studio 的外观设计风格,极大地方便了复杂业务场景下的开发工作流程。 以下是 DevExpress 官方文档提到的一个简单示例配置方法: ```xml <dxpg:PropertyGridControl SelectedObject="{Binding YourViewModel}" /> ``` 在此基础上,只需将视图模型实例传递给 `SelectedObject` 即可动态展示其内部成员变量及其对应的 UI 编辑界面。 --- #### 总结 无论是借助社区力量还是选用成熟的商业化产品,都可以有效提升用户体验以及简化编码过程。具体选择取决于实际项目的预算和技术栈偏好等因素考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值