(五)WPF - 依赖属性

这篇具有很好参考价值的文章主要介绍了(五)WPF - 依赖属性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在类上实现属性时,只要类派生自 DependencyObject,就可以选择使用 DependencyProperty 标识符支持属性,从而使其成为依赖属性。

1、定义依赖项属性

第一步是定义表示属性的对象,它是 DependencyProperty 类的实例
属性信息应该始终保持可用,甚至可能需要在多个类之间共享这些信息。因此,必须将 DependencyProperty 对象定义为与其相关联的类的静态字段。
字段的定义使用了 readonly 关键字,这意味着只能在 FrameworkElement 类的静态构造函数中对其进行设置。

    public class FrameworkEleent : UIElement
    {
        public static readonly DependencyProperty MarginProerty;
    }

2、注册依赖项属性

在与其关联的类的静态构造函数中进行。

WPF 确保 DependencyProperty 对象不能被直接实例化,因为 DependencyProperty 类没有公有的构造函数。相反,只能使用静态的 DependencyProperty.Register()方法创建 DependcyProperty 实例。WPF 还确保在创建 DependencyProperty 对象后不能改变该对象,因为所有 DependencyProperty 成员都是只读的。它们的值必须作为 Register()方法的参数来提供。

static FrameworkElement()
{

    FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
        new Thickness(),FrameworkPropertyMetadataOptions.AffectsMeasure);
    MarginProperty = DependencyProperty.Register("Margin",
    typeof(Thickness),typeof(FrameworkElement),metadata,
    new ValidateValueCallback(FrameworkElement.IsMarginValid));

}

注册依赖项属性需要经历两个步骤。

首先创建 FrameworkPropertyMetadata 对象,该对象指示希望通过依赖项属性使用什么服务(如支持数据绑定、动画以及日志)。接下来通过调用 DependencyProperty.Register() 静态方法注册属性。

在这一步骤中,您负责提供以下几个要素:

  • 属性名(在该例中为 Margin)
  • 属性使用的数据类型(在该例中为 Thicknewss 结构)
  • 拥有该属性的类新房(在该例中为 FrameworkElement 类)
  • 一个具有附加属性设置的 FrameworkPropertyMetadata 对象,该要素是可选的
  • 一个用于验证属性的回调函数,该要素是可选的

使用 FrameworkPropertyMetadata 对象配置创建的依赖项属性的附加功能。

FrameworkPropertyMetadata 类的大多数属性是简单的 Boolean 标志,通过设置这些属性来翻转某项功能(每个 Boolean 标志的默认值为 false)。只有少数几个是指向用于执行特定任务的自定义方法的回调函数,其中一个是 FrameworkPropertyMetadata.Defaultvalue,用于设置在第一次初始化属性时 WPF 将要应用的默认值。

3、添加属性包装器

最后一步:使用传统的.NET 属性封装 WPF 依赖项属性。
WPF 属性的属性过程是使用在 DependencyObject 基类中定义的 GetValue() 和 SetValue() 方法。

public Thickness Margin
{
    set{SetValue(MarginProperty,value);}
    get{return (Thickness)GetValue(MarginProperty);}
}

当创建属性封装器时,应当只包含对 SetValue() 和 GetValue() 方法的调用。

注意: 属性封装器不是验证数据或引发事件的正确位置,而是通过DenpendencyProperty.ValidateValueCallback 回调函数进行验证操作(即不应当在 set 和 get 里附加此类代码逻辑)。

若希望删除本地值设置,并像从来没有设置过那样确定属性值,则不能通过设置一个新值来实现。而是需要使用另一个继承自 DependencyObject 类的方法:ClearValue()。

该方法的用法:

myElement.ClearValue(FrameworkElement.MarginProperty);

4、WPF 使用依赖项属性的方式

使用依赖项属性的功能都是通过每个依赖项属性都支持的两个关键行为进行工作:更改通知和动态值识别。

更改通知: 当属性值发生变化时,依赖项属性不会自动引发事件以通知属性值发生了变化。相反,它们会触发受保护的名为 OnPropertyChangedCallback() 的方法。该方法通过两个 WPF 服务(数据绑定和触发器)传递信息,并调用 ProertyChangedCallback 回调函数。

动态值识别: 当从依赖项属性检索值时,WPF 需要考虑多个方面。

1)共享的依赖项属性

一些类会共享同一个依赖项属性,尽管这些类具有不同的继承层次。
例如,TextBlock.FontFamily 属性和 Control.FontFamily 属性指向同一个静态的依赖项属性,该属性实际上是在 TextElement 类中定义的 TextElement.FontFamilyProperty 依赖项属性,TextElement 类的静态构造函数注册该属性,而 TextBlock 类和 Control 类的静态构造函数只是简单通过 DependencyProperty.AddOwner()方法重用该属性:

TextBlock.FontFamilyProperty = TextElement.FontFamilyProperty.AddOwner(typeof(TextBlock));

2)附加的依赖项属性

定义附加的依赖项属性

FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
    0,new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged));

    Grid.RowProperty = DenpencyProperty.RegisterAttached("Row",typeof(int),
    typeof(Grid),metadata,new ValidateValueCallback(Grid.IsIntValueNotNegative));

当创建附加属性时,不需要定义.NET属性包装器。文章来源地址https://www.toymoban.com/news/detail-502916.html

到了这里,关于(五)WPF - 依赖属性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 派生属性-架构案例2020(三十七)

    架构风格 解释器和面向对象的区别? 灵活性:解释器更灵活,因为解释器架构风格是独立的一套规则,通过解释器解析,可以做到多个对象都面对这一个解释器。 可修改性:解释器修改性更好,不需要根据对象来修改,修改独立的规则就好。 性能:面向对象性能优于解释器

    2024年02月07日
    浏览(31)
  • C# wpf利用Clip属性实现截屏框

    第一章 使用GDI+实现截屏 第二章 制作截屏框(本章) ______第一节 使用DockPanel制作截屏框 ______第二节 利用Clip属性实现截屏框(本节) 第三章 实现截屏框热键截屏 第四章 实现截屏框实时截屏 第五章 使用ffmpeg命令行实现录屏 第一节已经实现过截屏框,实现方法相对简单,也仅

    2024年01月23日
    浏览(42)
  • C# wpf 附加属性实现任意控件拖动调整大小

    第一节 Grid内控件拖动调整大小 第二节 Canvas内控件拖动调整大小 第三节 窗口拖动调整大小 第四节 附加属性实现拖动调整大小(本章) 第五章 拓展更多调整大小功能 前面几节讲了控件拖动改变大小的几种方法,根据不同的布局可以有不同的实现方式。本节主要讲的是利用

    2024年02月11日
    浏览(49)
  • C#中WPF实现依赖注入和MVVM,以及服务定位ServiceLocator

    最近在想重写架构于是就研究了一套WPF的相关内容,WPF不像MAUI内置了容器,需要我们自己手动添加,于是就有了今天的内容。 首先,我们新建一个.net6.0的WPF项目 由于WPF没有内置容器,我们先安装一下依赖注入的nuget包 Microsoft.Extensions.DependencyInjection 点开App.xaml文件,修改为如

    2024年02月04日
    浏览(46)
  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。 并且随着工业化的进展,以及几年前微软对.NET平台的开源,国内大多

    2024年02月06日
    浏览(63)
  • 现代WPF界面轻松实现:探秘轻量级WPFUI库,MVVM与依赖注入一体化

      概述: 一款名为WPFUI的轻量级开源库,为WPF应用程序提供现代化界面。支持MVVM和 Microsoft.Extensions.DependencyInjection,简单上手。无第三方依赖,内置两套皮肤,可自定义样式。适用于一般应用场景,不受MVVM框架限制。通过简单的引用和配置,快速构建现代化WPF应用,提升用户

    2024年02月03日
    浏览(43)
  • WPF使用依赖注入

    现在依赖注入在.Net里面已经普及,自己常写一些简单的demo倒是无所谓,但偶尔写一点正式的工程,也免不了要使用一下,于是总结了一下在WPF里面使用依赖注入。 在写简单Demo时候,通常是在MainWindow的构造函数里面直接做初始化,各种变量也都丢在MainWindow类里面。在使用依

    2024年02月11日
    浏览(34)
  • WPF 用户控件依赖注入赋值

    我一直想组件化得去开发WPF,因为我觉得将复杂问题简单化是最好的 cs部分 我将复杂的依赖注入的代码进行了优化,减少了重复内容的输入。 我现在依赖属性扩展封装在一个静态文件里面 记得UserControl.xaml里面绑定你ViewModel。这样的话有代码提示 我后面要根据Vue的单向数据

    2024年02月07日
    浏览(44)
  • 深入理解WPF中的依赖注入和控制反转

    在WPF开发中, 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系 。今天就以一个简单的小例子,简述如何在WPF中实现依赖注入和控制反转,仅供学习分享使用,如有不足之处

    2024年02月06日
    浏览(53)
  • 掌握WPF控件:熟练常用属性(二)

    Calendar 用于日期选择的控件。它提供了一个可视化的界面,可以通过它来选择特定的日期。 常用属性 描述 DisplayMode 用来设置Calendar的显示模式,有三种可选值:默认Month(月)、Year(年)和Decade(十年)。 SelectedDate 用来获取或设置当前选中的日期。 Mode 用来设置Calendar的显

    2024年01月20日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包