首页 > 编程语言 >(4) C# 依赖项属性

(4) C# 依赖项属性

时间:2022-12-08 15:35:41浏览次数:64  
标签:依赖 DependencyProperty C# Thickness FrameworkElement -- new 属性

  把对象赋值给属性

 一、依赖属性

1.定义依赖属性

一般情况下只是使用,但如果要自定义WPF控件或者给现有的WPF控件增加新功能时就需要自定义。

定义时需要用到特殊的语法:

  • 静态的
  • 使用readonly只能在构造时初始化
  • 必须是DependencyProperty类实例
  • 属性名称后面要带上Property

定义一个Margin依赖项属性的例子

public static readonly DependencyProperty MarginProperty;

 

2.注册依赖属性

(1)创建FrameworkPropertyMetadata对象,指明通过依赖项属性使用什么服务(支持数据绑定,动画,日志等)

FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(new Thickness(), FrameworkPropertyMetadataOptions.AffectsMeasure);

 

(2)调用DependencyProperty.Register()静态方法注册属性 

五个参数

  • 属性名
  • 属性使用的数据类型
  • 拥有该属性的类型
  • 具有附加属性设置的FrameworkPropertyMetadata对象(此参数可选)
  • 用于验证属性的回调函数(此参数可选)

在构造函数中

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

 

3.封装WPF依赖属性

使用DependencyObject类的SetValue()和GetValue()方法

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

设置属性

element.Margin = new Thickness(5);

 

4.例子

一个按钮继承关系 Button--》ButtonBase--》ContentControl--》Control--》FrameworkElement--》UIElement--》Visual--》DependencyObject--》DispatcherObject--》Object

其中

  • ​ButtonBase ​​​表示所有 ​​Button​​ 控件的基类,在System.Windows.Controls.Primitives命名空间下(和winfrom下的ButtonBase虽然名字相同,但完全是两条不同的路线)
  • ​ContentControl ​​ 表示包含一段任意类型内容的控件
  • ​Control​​ 表示用户界面 (UI) 元素的基类,这些元素使用 ControlTemplate 来定义其外观
  • ​FrameworkElement​​ 提供 WPF元素的属性、事件和方法的 WPF 框架级别集
  • ​UIElement​​ 是 WPF 核心级实现的基类,这些实现是在 WPF元素和基本表示特性上生成的
  • ​Visual​​ 为 WPF 中的呈现提供支持,其中包括命中测试、坐标转换和边界框计算
  • ​DependencyObject​​ 表示参与依赖属性系统的对象,如果设置依赖属性直接继承此类即可

 

完整代码:自定义FrameworkElement类

class FrameworkElement:UIElement
{
public static readonly DependencyProperty MarginProperty;

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

private static bool IsMarginValid(object value)
{
throw new NotImplementedException();
}

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

去掉ValidateValueCallback参数

使用

FrameworkElement element = new FrameworkElement();
element.Margin = new Thickness(5);

 

4.依赖属性变更通知

有两种方式通知依赖属性变化 --后补

(1)属性值创建绑定

(2)编写能够自动改变其他属性或开始动画的触发器

 

5.共享依赖属性

查看TextBlock源码,没有用DependencyProperty.Register注册,而是使用了TextElement的FontFamilyProperty的依赖属性

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

 

6.附加依赖属性

附加属性被应用的类不是定义附加属性的那个类,

比如  DockPanel 的DockProperty属性

[CommonDependencyProperty]
public static readonly DependencyProperty DockProperty;

static DockPanel()
{
  DockProperty = DependencyProperty.RegisterAttached("Dock", typeof(Dock), typeof(DockPanel), new FrameworkPropertyMetadata(Dock.Left, OnDockChanged), IsValidDock);
}

DockPanel.Dock 属性作用到了Border上

<DockPanel LastChildFill="True">
<Border Height="25" Background="SkyBlue" BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Top">
<TextBlock Foreground="Black">Dock = "Top"</TextBlock>
</Border>
<Border Height="25" Background="SkyBlue" BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Top">
<TextBlock Foreground="Black">Dock = "Top"</TextBlock>
</Border>
<Border Height="25" Background="LemonChiffon" BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Bottom">
<TextBlock Foreground="Black">Dock = "Bottom"</TextBlock>
</Border>
<Border Width="200" Background="PaleGreen" BorderBrush="Black" BorderThickness="1" DockPanel.Dock="Left">
<TextBlock Foreground="Black">Dock = "Left"</TextBlock>
</Border>
<Border Background="White" BorderBrush="Black" BorderThickness="1">
<TextBlock Foreground="Black">This content will "Fill" the remaining space</TextBlock>
</Border>
</DockPanel>

(4) C# 依赖项属性_控件

 

 附加属性不需要进行属性封装,可以用于任何依赖对象

 

 

二、属性验证

1.验证回调

 

2.强制回调

 



标签:依赖,DependencyProperty,C#,Thickness,FrameworkElement,--,new,属性
From: https://blog.51cto.com/u_13854953/5922270

相关文章

  • 使用 archetype-catalog 快速搭建
    在使用IDEA新建一个MavenArchetype的时候ArcheType的可选项并不是很多。我们可以从apachemaven下载一份archetype-catalog来快速搭建想要的项目。1.从https:......
  • 5.class
    一、类classGreeter{greeting:string;constructor(message:string){this.greeting=message;}greet(){return"Hello,"+this.g......
  • javascript-代码随想录训练营day14
    递归的三要素:递归函数的参数和返回值单层递归的逻辑终止条件144.二叉树的先序遍历题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/题目描......
  • 用pageOffice控件实现 office word文档在线另存为pdf的功能
    用pageOffice控件实现officeword文档在线另存为pdf的功能1应用场景OA办公中,经常要将word文档转存为pdf方法,方式文档的查看。怎么实现word文档的转存为pdf呢?2实现方......
  • Azure Devops 流水线任务插件开发教程 (1/3) —— Quick Start
    目录azuredevops流水线插件的示例概述如何开始开发azuredevops流水线插件的示例概述正如标题所述这是一个简易的流水线任务插件的示例,比起官方的要简单很多,可以让大......
  • 如何将rpm软件包及其所有的依赖,都下载到本地的一个目录中?
    为了实现这个功能,需要用到:downloadonly插件 1、安装downloadonly插件 yuminstallyum-plugin-downloadonly 2、下载某个软件及其依赖到本地的目录 yumi......
  • SourceGenerator 使用姿势(1):生成代理类,实现简单的AOP
    SourceGenerator已经出来很久了,也一直在关注。之前观摩大佬 xljiulang 的 WebApiClient 使用SourceGenerator生成接口代理类,深受启发,准备拿过来用看看(发出白嫖的声......
  • AutoCad系统变量
    些常用的系统变量,当图纸出现一些问题时,你可以对出现问题的原因有些初步的判断,并可以通过修改变量设置快速解决。在CAD(无论是AUTOCAD还是浩辰CAD等其他CAD)的帮助中通常有......
  • 如何通过C#合并Word文档?
    合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏内容,以及耗费不必要的时间,同时,也方便了人们阅读或者对其进行再次修改。例如,在我们进行团队作业的时......
  • docker安装dubbo-admin和zookeeper
    拉取镜像dockerpullcao2068959/dubbo-admin:2.7创建目录mkdirdubbo-admincddubbo-admin/编写properties文件viapplication.propertiesadmin.registry.ad......