WPF里的DependencyProperty(2)

python使用TensorRT报错,多线程或多进程中使用问题 python使用TensorRT报错,Cuda Runtime问题 阅读详情

废话

照例,每篇开头都说些废话。
一年前写了一篇.Net3.0里的DependencyProperty(1),没下文了,很对不起大家。是啊,都是一年前的事情了。这一年中发生了很多事情……(略)……,最近终于又有空开始研究WPF了。一年过去,WPF发布了3.5版本,有了许多不大不小的改变,我准备接着去年的进度,继续研习下去,现在就先试着把去年准备写的关于DependencyProperty的东西写完吧。
去年说到要介绍一下DependencyProperty的应用,好的,我们继续。

DependencyProperty用在哪儿?

这一节的内容都摘抄自MSDN^_^,因此详细的资料都可以参考MSDN,我在这里稍微解释一下,主要是为了下一个小节做下铺垫。

  • Resources(资源)

  • Data binding(数据绑定)

  • Styles(风格)

  • Animations(动画)

  • Metadata overrides(元数据覆盖)

  • Property value inheritance(值继承)

  • WPF Designer integration(WPF设计集成)

Resources和Data binding中,XAML提供了这样一种语法,来为属性赋值:

< Button  Background ="{DynamicResource MyBrush}" />
< Button  Content ="{Binding XPath=Team/@TeamName}" />

 

这种用{}括起来配上DynaminResource或者Binding关键字,这在WPF中叫做"Markup Extension"(标记扩展?)。这种语法非常好用,不过如果你之前没有接触过WPF一定会觉得这种语法很奇怪。如何使用这种语法不是我们现在要讨论的内容,现在的关键是如果你希望用Markup Extension来为属性赋值,那么这个属性必须是Dependency Property。

Styles中,WPF为我们提供了一个叫"Setter"的工具来为属性赋值,比如这样:

< Style  x:Key ="GreenButtonStyle" >
< Setter  Property ="Control.Background"  Value ="Green" />  
</ Style >

 

我第一次看到这种语法的时候想到了css,类似下面这样代码

.GreenButtonStyle{ Background:Green;}

对比起来,也许你很容易理解上面的XAML代码了
在这里,XAML和HTML的区别在于HTML是动态的解释性的而XAML是需要被编译的,是强类型的。你需要记住的是,如果希望使用Setter,那么目标属性必须是DependencyProperty。

在WPF的动画中,你可以使用一些方法将一个Animation对象应用在某些属性上,然后WPF会使用一个Clock让属性值进行变化从而产生动画效果。看这个简单的例子:

 

< Button > I am animated
  
< Button.Background >
    
< SolidColorBrush  x:Name ="AnimBrush" />
  
</ Button.Background >
  
< Button.Triggers >
    
< EventTrigger  RoutedEvent ="Button.Loaded" >
      
< BeginStoryboard >
        
< Storyboard >
          
< ColorAnimation
            
Storyboard.TargetName ="AnimBrush"  
            Storyboard.TargetProperty
="Color"
            From
="Red"  To ="Green"  Duration ="0:0:5"  
            AutoReverse
="True"  RepeatBehavior ="Forever"   />
        
</ Storyboard >
      
</ BeginStoryboard >
    
</ EventTrigger >
  
</ Button.Triggers >
</ Button >

 

注意ColorAnimation小节,定义了TargetProperty是"Color",然后让Color从"Red"到"Greed"变化,同时设定了其他一些参数。动画过程不多介绍,你需要记住的是,如果你希望对某个属性应用动画,那么这个属性必须是DependencyProperty

下面是Metadata Overrides,这个可能比较难理解。这么说吧,每个属性都有自己的Metadata(元数据),在里面我们可以存放比如属性的“默认值”,当然真实的元数据里还包含了更多的信息。具体的就不多讨论了,我们只需要了解,DependencyProperty可以支持元数据的覆盖。在某些时候,这是非常有用的,之后会提到。

Property Value Inheritance,属性值继承。这是DependencyProperty实现的很重要的一个功能,很多介绍DependencyProperty的文章都会用这个功能来引入DependencyProperty。举个非常常见的例子,假设我们布局时,包含了这么一个关系:

Window -> Grid -> Button

这形成了一颗“逻辑树”,很容易理解,Window里套了个Grid,Grid里有个Button。现在我们把Window的Fontsize也就是字体大小改变,你会发现在WPF中Button的字体大小也会相应变化。这在WInform中是做不到的。
也许你觉得没什么,仅仅是一个值的继承而已,但是如果你深入想想,Window包含Fontsize这个属性,Button也有,这很好,但是Grid并没有包含Fontsize属性啊,这个值又是怎么继承到Button上的呢?答案就是利用Dependency Property提供的继承功能。

最后所谓的WPF Designer integration,是指如果你在自定义控件中使用了Dependency Property,那么VS或者Blend的属性编辑器中就会自动出现相应的属性。

其实除了上面这些MSDN中提到的,DependencyProperty的用途还有很多,总的说来,就是这个属性的值不再独立,将与其他的属性值产生一定的“依赖”关系。因此名曰:Dependency Property

WPF中DependencyProperty到底实现了什么?

上面那些功能如果使用DependencyProperty,就不能解决,至少会很复杂,否则Microsoft也不会弄出这么一套东西出来。现在我们来总结一下,DependencyProperty自身到底要实现哪些传统属性无法实现或很难实现的功能(上面的应用是抄MSDN的,DependencyProperty还有些功能上面并没有提到,我一并列在下面)

高效的属性值存储
如果你对.net的属性以及元数据等概念了解比较深,也许你第一反应就是DependencyProperty封装了很多反射功能。是的,不论是"Markup Extension"还是"Setter",还是"Animation",我们仅仅通过XAML或程序中的一些字符串就完成了对属性的访问,这正是反射的特征。由于XAML的需要,或者是WPF team项目经理的需要,WPF team决定在WPF中大量使用反射。要知道,反射一向是C#的“贵族功能”,十分损耗性能,假若所有的属性我们都直接通过反射读取,估计在WPF应用程序在性能上就无法接受了(其实现在WPF应用程序在性能上也不怎么地)。DependencyProperty在底层封装了高效的Hash算法来解决通过字符串获得值的问题,在后面的POST中,我会详细介绍DependencyProperty是如何存储值的。
因此,有了DependencyProperty,我们可以放心的使用"Markup Extension","Setter"等等一系列令人激动的功能了,这影响的功能还不只这些,WPF中实现的数据绑定,动画等等强大功能,都靠这个了。

属性的继承
正如上面Window->Grid->Button的例子,在WPF的逻辑树中,我们将使用DependencyProperty来完成属性的继承。

自动的进行重新布局
这可能不太好解释,如果你了解过WPF的layout机制可能会比较容易理解。
WPF中并没有传统窗体重绘的机制,所谓“重绘”,是通过DependencyProperty的自动更新属性值来进行的。
当WPF中某些视觉元素的属性变化时,WPF系统能够通过DependencyProperty自动进行重新的"Measure"来确定自己的尺寸大小是否发生了变化,或者自动"Arrange"来确定是否要重新排列自己子元素的位置,又或者自动"Render"来重新绘制元素的图形。
举个例子,我们通常把绘制Button的背景色代码写在Button控件的OnRender事件中,当一个Button的Background属性值变化时,通过DependencyProperty可以引起一个自动Render的过程,又比如,一个Grid对象的行数属性或者列数属性发生改时,Grid应该能够自动重新排列他的子元素。

属性值的验证和强制值
DependencyProperty还实现了验证输入值的功能,并且当这些值不满足验证条件时,强制的为属性赋一个满足条件的值。

属性改变通知
DependencyProperty实现的另外一个功能是自动的属性改变通知,也就是当某个属性的值发生变化时执行某个函数或是触发某个事件。

其他我没注意的功能
其实DependencyProperty的机制完全足以让他提供更多的功能,我不可能把它的功能实现一一罗列出来……因此,放上这最后一点。

这些功能都通过一定的机制被DependencyProperty完美的实现了,当我们需要使用这些功能的时候,我们只需要自定义一个DependencyProperty来实现就行了(很符合Microsoft的一贯风格……惯坏程序员 呵呵)

注:WPF的DependencyProperty,而非.net


如果你足够细心,也许你已经发现和去年那篇文章不同,我把标题从".Net3.0里的DependencyProperty"改为了"WPF中俄DependencyProperty"。以前我认为DependencyProperty是.net3.0的新特性,后来发现这是错误的,查看.net3.0/3.5的类库就会发现,居然有两个不同命名空间但重名的DependencyProperty!

System.Windows.DependencyProperty,这属于WPF一部分
System.Workflow.ComponentModel.DependencyProperty,这属于WWF一部分

DependencyProperty在WWF中也有很特别的应用,可以为一个属性分配ActivityBind,从而让这个属性的值依赖某Activity,这和WWF关系较大,这里不详细说明。基本用法可以参考:http://www.cnblogs.com/carysun/archive/2008/04/12/1149249.html中的内容或者其他资料。
但要注意,WWF中的DependencyProperty虽然和WPF中的用法很像,但他和WPF中的DependencyProperty完全不是一个东西
两者有什么不同呢?这么说吧,两者支持的功能不同,例如WPF的DP支持了Animation,而WWF中的DP支持了ActivityBind,而更加有意思的是两者的实现机制虽然大体类似,但具体的代码实现完全不同!如果你有兴趣,你可以使用Reflactor查看一下这两个不同的DependencyProperty的源码。似乎能看出一些MS内部重构代码的痕迹——一个team写了一些代码,另一个team拿去加入了自己的功能,重构了实现,release了两套代码……并且,相比起来感觉WPF Team的版本比WWF team的版本的DependencyProperty复杂多了……扯远了,打住。。。
所以纠正一下,我上面所说的DependencyProperty,以及之后想继续说的,是System.Windows.DependencyProperty,WPF的一部分,而非什么".net 3.0中的Dependency Property"。

小结

这一篇Post首先抄了不少MSDN,介绍了通过DependencyProperty,WPF得以实现的一些功能。然后,我又试图总结了一下DependencyProperty自身所实现的功能,给大家做个参考吧。发现我还是没有开始介绍WPF DependencyProperty的详细用法,下次一定要写了。

下一篇Post(我肯定不会再拖一年了^_^就这两天吧),我将开始介绍WPF DependencyProperty的具体用法,并试图一并剖析它的实现机制。

最近在研究WPF做项目,希望和大家多多交流,如果文章中有什么不正确的地方,请大家多多指正~

保姆级教程:用ROS2 Humble和激光雷达,5分钟搞定机器人避障(附Python代码) 本文提供了一份详细的ROS2 Humble激光雷达避障实战指南,帮助开发者快速实现机器人避障功能。通过环境配置、硬件连接和Python代码实现,5分钟内即可让机器人自主避开障碍物。文章还涵盖了参数调优、常见问题排查及进阶优化技巧,适合机器人开发初学者和进阶用户。 阅读详情

相关推荐

C# 与 PaddleOCR:一行代码实现高效图片文字识别的实战指南

本文介绍了如何使用 PaddleOCRSharp 进行图像文字识别,涵盖了从环境准备到高级功能的完整流程。首先,通过 NuGet 安装 PaddleOCRSharp 并下载预训练模型。接着,展示了单张图片识别的最小化示例和详细实现,包括模型配置、图片预处理和结果输出。进阶功能部分介绍了多语言和竖排文本识别的实现方法。此外,文章还提供了 WinForms 图形界面开发的完整示例,展示了如何通过界面加载图片、执行识别并展示结果。最后,探讨了批量处理优化策略,如并行处理多张图片以提高性能。通过这些步骤,开发者可以

墨夶的博客 979

WPF学习笔记06-依赖属性DependencyProperty

依赖属性01

qq_23506909的博客 2863

解决QT5调用软键盘qvirtualkeyboard时崩溃问题ime_pinyin::MatrixSearch::init_user_dictionary

但是偶尔也会出现问题,譬如,我这边在Arm系统上跑着程序的时候,点击用户编辑框,输入法弹出,但是再次点击密码输入框,连程序都给我崩溃了。只是提示错误:void ime_pinyin::MatrixSearch::init_user_dictionary。首先确保你的Arm版QT库已经编译了软键盘,位置有时候就和lib同级目录,qtvirtualkeyboard。QT5中的软键盘qvirtualkeyboard很好用,很多人开发嵌入式端应用的时候都会用到。此外还有很多其他的输入法字典,像。

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 1962

Focusable 属性和IsTabStop 属性之间的关系

控件的Focusable 属性确定控件是否允许接收键盘输入焦点,控件的 IsTabStop 属性确定是否允许通过Tab键导航到控件。在默认情况下,Focusable 属性位true的控件IsTabStop 属性也会为true。 当Focusable 属性为true,IsTabStop 属性为true的时候,控件可以接收键盘输入焦点,也可以通过Tab键导航到控件; 当Focusable 属性为t

Milo的专栏 3737

WPF依赖属性以及MVVM绑定(Binding)问题

依赖属性 在wpf中,所有支持绑定的属性本质上都是封装后的依赖属性,也就是说,只有依赖属性才可以进行绑定 下面演示了在Button按钮上为Content属性设置了一个绑定语法, 如下所示: <Button Content="{Binding Content}"/> 当你在Content属性按下F12转到定义时,可以观察到Button按钮所继承的类的定义,如下所示: 如图上红圈位置, 定义了一个静态的只读字段ContentProperty。 通过查看该字段的类型DependencyProperty

qq_43121342的博客 1732

示例:WPF中应用DependencyPropertyDescriptor监视依赖属性值的改变

可以看到,当修改TextBlock的Background属性时,Text的值也做出相应改变。

HeBianGu的博客 1366

WF的DependencyProperty

  1             DependencyProperty从属属性 1.     从属属性要定义为静态.为了在外部可以绑定,最好定义为Public 2.     从属属性实际上是取代了正常属性的存值变量 3.     如果从属属性所对应的正常属性是实例成员,操作属性值时的表现形式为实例成员 4.     只有继承System.Workflow.ComponentModel.De...

weixin_34248487的博客 233

车辆异常排查全指南:从故障灯到异响,抓住小问题避免大修

车辆出现异常时,最怕拖着“再开开看”,小问题往往拖成大故障。面对发动机故障灯亮、刹车异响、车身抖动等现象,掌握一套系统的排查逻辑至关重要。本文从汽车电子诊断的基础原理出发,介绍如何利用OBD诊断仪读取故障码、结合仪表盘警示灯和驾驶工况进行科学判断,再辅以机油、冷却液、刹车油和轮胎的基础检查方法,帮你在故障扩大前精准定位问题。这套思路适用于新手司机、老车主及二手车用户,既能降低维修成本,也能提升行车安全。文章同时梳理了水温过高、机油压力报警等必须立即送修的典型信号,旨在帮助车主建立从发现异常、初步自查到高效送

weixin_33800463的博客 289

从脚本到系统:Python自动化任务工程化避坑指南

在软件开发与数据处理领域,脚本自动化是提升效率的核心技术。其原理在于通过编写程序替代重复性手动操作,实现任务的批量执行。这项技术的核心价值在于将人力从繁琐劳动中解放出来,确保处理过程的一致性与可重复性,是构建数据管道和自动化工作流的基础。在实际应用场景中,无论是日常的数据清洗、API调用集成,还是定时的报表生成,一个健壮的自动化脚本都至关重要。然而,从一次性的脚本到稳定可靠的生产级系统,开发者常会忽视工程化细节,导致在批量处理时遭遇日志混乱、内存泄漏和异常处理不当等问题。本文以Python为例,深入探讨如何

weixin_34387468的博客 395

WPFDependencyProperty

http://www.cnblogs.com/yayx/archive/2008/06/03/1213126.html

Oops! 762

为什么silverlight的PasswordBox控件的password属性不可以绑定?该如何实现绑定?

有人发现想Password的控件中实现如下的绑定, Code<UserControlx:Class="SilverlightApplication9.Page"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com...

Susan_0401的博客 283

WPF基础五:UI④ 条目控件ComboBox

表示带有下拉列表的选择控件,通过单击控件上的箭头可显示或隐藏下拉列表。 ComboBox允许用户从下拉列表中选择项,或根据需要在控件的文本框中输入新文本。 ComboBox是ItemsControl,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。有关更多信息,请参见ItemsControl类。 IsEditable和IsReadOnly属性指定ComboBox用户执行以下操作之一时的行为方式: 输入一个字符串以选择中的项ComboBox。 输入不与...

hd51cc的博客 2072

​​​​​​​Storyboard_故事板

1、先创建一个正方形和一个椭圆 2、然后创建事件触发器 ,在页面加载后触发事件 , 当创建事件触发器时,需要指定开始触发器的路由事件和路由触发器执行的一个或多个动作。 3、对于动画,最常用的动作是BeginStoryboard,该动作相当于调用BeginStoryboard()方法 ,所以,在事件触发器后加上一个BeginStoryboard作为开始的标志;接下来就是故事板,再...

蓝Buff的博客 451

写一个简约的WPF登录窗体

Hello,大家好,我是若汝棋茗,今天让我来给大家水一篇WPF窗口的博客。 先看效果图 还比较满意吧,那就让我们开始吧!! 首先引入RRQMSkin包,因为窗体有圆角,并且需要改变尺寸,所以使用RRQMEffectWindow来实现。 然后修改window继承类为RRQMEffectWindow,后台代码一致。 然后,重写RRQMEffectWindow模板。 <Style x:Key="MainWindowStyle" TargetType="{x:Type Custom:RRQM

若汝棋茗 的博客 1296

Dependency Property

References: https://www.tutorialspoint.com/wpf/wpf_dependency_properties.htm define a new mouse event: mouseover. <Window x:Class="DependencyProperties.MainWindow" xmlns="http://schema...

qq_41617901的博客 179

一站式WPF--依赖属性(DependencyProperty)一

 Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能,这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。  这段是MSDN上对依赖属性(DependencyProperty)的描述。主要介绍了两个方面,WPF中提供了可用于扩展CLR属性的服务;被这个服

xiaochongchong1248的专栏 1222

Pascal Analyzer 7.1.3

pascal 代码分析器,用于了解程序运行效率,是否有内在bug等等。支持Delphi,lazarus多种开发工具,是从事产品开发工程师的益友。Pascal Analyzer, or PAL for short, is a utility program that analyzes, documents, debugs, and helps you optimize your source code. Pascal Analyzer makes a static code analysis. It only needs the source code unlike other similar tools that perform an analysis of the running program. It is our belief that it will help you better understand your code and support you in producing code of higher quality, consistency, and reliability. PAL quickly pays itself back in easier maintenance, less errors and improved quality, not only during development, but also throughout the entire life cycle of your code.

基于ROS框架的室内自主导航机器人系统_实现SLAM定位建图与路径规划功能_包含自动定位建图手动建图定点导航固定线路巡航算法切换参数分析等模块_采用Turtlebot2机.zip

基于ROS框架的室内自主导航机器人系统_实现SLAM定位建图与路径规划功能_包含自动定位建图手动建图定点导航固定线路巡航算法切换参数分析等模块_采用Turtlebot2机.zip

上一篇: WPF里的DependencyProperty(1)
下一篇: WPF里的DependencyProperty(3)
pnuts
博客等级 码龄19年 6粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值