如何理解WPF中的依赖项属性
发布网友
发布时间:2022-04-30 02:48
我来回答
共2个回答
懂视网
时间:2022-04-30 07:09
比如:我们查看DataGridColumnHeader的Content依赖属性
1.我们用到的windbg的命令有:!do, !da -details, .formats 2.利用!do查看依赖对象的成员变量, 找到具体依赖属性的地址0:000> !do 00000000039a71d8Name: System.Windows.Controls.Primitives.DataGridColumnHeaderMethodTable: 000007fee7e58090EEClass: 000007fee7885bd8Size: 384(0x180) bytesFile: C:WindowsMicrosoft.NetassemblyGAC_MSILPresentationFrameworkv4.0_4.0.0.0__31bf3856ad364e35PresentationFramework.dllFields: MT Field Offset Type VT Attr Value Name000007fef3f2eb00 4000db0 8 ...eading.Dispatcher 0 instance 0000000002dd4e68 _dispatcher000007fef3f3bb88 4001321 10 ...endencyObjectType 0 instance 000000000308a530 _dType000007fef7825ac8 4001322 18 System.Object 0 instance 0000000000000000 _contextStorage000007fef3f3e898 4001323 20 ...ctiveValueEntry[] 0 instance 00000000042efb08 _effectiveValues000007fef7847b70 4001324 28 System.UInt32 1 instance 3680277 _packedData000007fef3f33708 400131f 7c0 ...ependencyProperty 0 static 0000000002dd5ef0 DirectDependencyProperty---------------------省略部分----000007fef3f33708 40002ca 950 ...ependencyProperty 0 static 0000000002dfd820 ContentProperty0000000000000000 40002cb 958 0 static 0000000002dfd908 HasContentPropertyKey000007fef3f33708 40002cc 960 ...ependencyProperty 0 static 0000000002dfd948 HasContentProperty000007fef3f33708 40002cd 968 ...ependencyProperty 0 static 0000000002dfdb00 ContentTemplateProperty000007fef3f33708 40002ce 970 ...ependencyProperty 0 static 0000000002dfdc80 ContentTemplateSelectorProperty
3.利用!do命令查看依赖属性的成员变量值, 比如:0:000> !do 0000000002dfd820Name: System.Windows.DependencyPropertyMethodTable: 000007fef3f33708EEClass: 000007fef3dd7550Size: 88(0x58) bytesFile: C:WindowsMicrosoft.NetassemblyGAC_MSILWindowsBasev4.0_4.0.0.0__31bf3856ad364e35WindowsBase.dllFields: MT Field Offset Type VT Attr Value Name000007fef7826970 400133c 8 System.String 0 instance 0000000002dfd630 _name000007fef78282f8 400133d 10 System.Type 0 instance 0000000002d444b0 _propertyType000007fef78282f8 400133e 18 System.Type 0 instance 0000000002dfab80 _ownerType000007fef3f312a8 400133f 20 ....PropertyMetadata 0 instance 0000000002dfd7c0 _defaultMetadata000007fef3f31088 4001340 28 ...dateValueCallback 0 instance 0000000000000000 _validateValueCallback000007fef3f3e750 4001341 30 ...ndencyPropertyKey 0 instance 0000000000000000 _readOnlyKey000007fef4194818 4001342 40 System.Int32 1 instance 4194530 _packedData000007fef3f3e408 4001343 48 ....InsertionSortMap 1 instance 0000000002dfd868 _metadataMap000007fef3f30fc8 4001344 38 ...erceValueCallback 0 instance 0000000000000000 _designerCoerceValueCallback000007fef7825ac8 400133b 808 System.Object 0 static 0000000002d72000 UnsetValue000007fef3f3c6c0 4001345 800 ...ty, WindowsBase]] 1 static 0000000012d5bb10 RegisteredPropertyList000007fef7831c38 4001346 810 ...ections.Hashtable 0 static 0000000002d6f3d8 PropertyFromName000007fef782c858 4001347 5c8 System.Int32 1 static 868 GlobalIndexCount000007fef7825ac8 4001348 818 System.Object 0 static 0000000002d6f430 Synchronized000007fef78282f8 4001349 820 System.Type 0 static 0000000002d68808 NullableType
4.利用.formats 得到依赖属性, 分2步 1)利用.formats 0n得到_packedData十六进制 2) 去掉高位,Decimal描述的就是依赖属性在依赖对象中的存储索引
如下:0:000> .formats 0n4194530Evaluate expression: Hex: 00000000`004000e2 Decimal: 4194530 Octal: 0000000000000020000342 Binary: 00000000 00000000 00000000 00000000 00000000 01000000 00000000 11100010 Chars: .....@.. Time: Wed Feb 18 21:08:50 1970 Float: low 5.87779e-039 high 0 Double: 2.07237e-3170:000> .formats 00e2Evaluate expression: Hex: 00000000`000000e2 Decimal: 226 Octal: 0000000000000000000342 Binary: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11100010 Chars: ........ Time: Thu Jan 01 08:03:46 1970 Float: low 3.16693e-043 high 0 Double: 1.11659e-321
可知ContentProperty依赖属性在DataGridColumnHeader中的索引为226
5. 根据第4步的index,从第2步依赖对象的_effectiveValues 得到依赖属性的具体值,分3步: 1)利用!da -details 查看_effectiveValues 数组所有元素的值 2)查看每个元素,根据_propertyIndex (即第4步得到的Decimal值)确定依赖属性 3)利用!do命令查看元素的_value成员的值
比如:
0:000> !da -details 00000000042efb08Name: System.Windows.EffectiveValueEntry[]MethodTable: 000007fef3f3e898EEClass: 000007fef3e0c8a0Size: 408(0x198) bytesArray: Rank 1, Number of elements 24, Type VALUETYPEElement Methodtable: 000007fef3f36120[0] 00000000042efb18 Name: System.Windows.EffectiveValueEntry MethodTable: 000007fef3f36120 EEClass: 000007fef3dd8c90 Size: 32(0x20) bytes File: C:WindowsMicrosoft.NetassemblyGAC_MSILWindowsBasev4.0_4.0.0.0__31bf3856ad364e35WindowsBase.dll Fields: MT Field Offset Type VT Attr Value Name 000007fef7825ac8 400136e 0 System.Object 0 instance 0000000002e1c5d8 _value 000007fef7830940 400136f 8 System.Int16 1 instance 3 _propertyIndex 000007fef41949d0 4001370 a System.Int16 1 instance 2 _source
--------------------------------省略部分------------------------------
[15] 00000000042efc08 Name: System.Windows.EffectiveValueEntry MethodTable: 000007fef3f36120 EEClass: 000007fef3dd8c90 Size: 32(0x20) bytes File: C:WindowsMicrosoft.NetassemblyGAC_MSILWindowsBasev4.0_4.0.0.0__31bf3856ad364e35WindowsBase.dll Fields: MT Field Offset Type VT Attr Value Name 000007fef7825ac8 400136e 0 System.Object 0 instance 00000000042efca0 _value 000007fef7830940 400136f 8 System.Int16 1 instance 226 _propertyIndex 000007fef41949d0 4001370 a System.Int16 1 instance 65 _source
可知ContentProperty为_effectiveValues的第16个元素, 其值存储在_value中
0:000> !do 00000000042efca0 Name: System.Windows.ModifiedValueMethodTable: 000007fef3f40d58EEClass: 000007fef3e0d000Size: 48(0x30) bytesFile: C:WindowsMicrosoft.NetassemblyGAC_MSILWindowsBasev4.0_4.0.0.0__31bf3856ad364e35WindowsBase.dllFields: MT Field Offset Type VT Attr Value Name000007fef7825ac8 4001387 8 System.Object 0 instance 0000000000000000 _baseValue000007fef7825ac8 4001388 10 System.Object 0 instance 0000000000000000 _expressionValue000007fef7825ac8 4001389 18 System.Object 0 instance 0000000000000000 _animatedValue000007fef7825ac8 400138a 20 System.Object 0 instance 0000000002d93618 _coercedValue
6.根据第5步中的成员_coercedValue得到依赖属性的具体值,大功告成!
0:000> !do 0000000002d93618Name: System.StringMethodTable: 000007fef7826970EEClass: 000007fef73aeec8Size: 36(0x24) bytesFile: C:WindowsMicrosoft.NetassemblyGAC_64mscorlibv4.0_4.0.0.0__b77a5c561934e089mscorlib.dllString: 导入数据源Fields: MT Field Offset Type VT Attr Value Name000007fef782c858 40000ed 8 System.Int32 1 instance 5 m_stringLength000007fef782b398 40000ee c System.Char 1 instance 5bfc m_firstChar000007fef7826970 40000ef 10 System.String 0 shared static Empty >> Domain:Value 00000000007f85a0:0000000002d41420 <<
版权声明:本文为博主原创文章,欢迎转载,仅请署名
Windbg调试WPF的依赖属性
标签:wpf dependencyproperty dependencyobject windbg 依赖属性
热心网友
时间:2022-04-30 04:17
依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。依赖项属性是通过调用 Register 方法(或 RegisterReadOnly)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符标示属性。 依赖项属性只能由继承自 DependencyObject 类的类型使用,但 DependencyObject 在 WPF 类层次结构中的级别很高,因此,WPF 中的大多数可用类都支持依赖项属性。
如何理解WPF中的依赖项属性
依赖属性就是自己自己没有值,通过Binding从数据源获得值,就是依赖在别人身上,拥有依赖属性的对象称为依赖对象。几种应用依赖属性的场景:1. 希望可在样式中设置属性。2. 希望属性支持数据绑定。3. 希望可使用动态资源引用设置属性。4. 希望从元素树中的父元素自动继承属性值。5. 希望属性可进行动画...
简单点说:wpf中依赖项属性与普通属性的异同
不是。依赖属性是要注册的,而且通常都是改变时候会触发类的响应。class a { int r;这是个属性,但是改变的时候不会发生什么,只是r的值变了。但是如果是一个控件的长,它改变的时候就会直接在ui表现出来,会立刻改变空间的长,这就是依赖属性,这样理解比较形象。} ...
C#/WPF高手进!关于依赖属性、附加属性等声明方式以及静态构造函数、静态...
WPF里的依赖属性 都是 继承 自 DependencyObject。对于 依赖属性 和 附加依赖属性的 那个静态量,你可以当做一个Key。在 DependencyObject 的内部有一个 类似与字典的东西,通过当前这个Key去取里面的取,得到你最终的属性值。你可以去微软官网上查看源码。定义依赖属性的时候,一般我们都会定义一个 属性...
WPF基础教程之属性系统
依赖项属性 一个由 DependencyProperty 支持的属性 依赖项属性标识符 一个 DependencyProperty 实例 在注册依赖项属性时作为返回值获得 之后将存储为一个类成员 在与 WPF 属性系统交互的许多 API 中 此标识符用作一个参数 CLR 包装 属性的实际 get 和 set 实现 这些实现通过在 GetValue 和 SetValue 调...
xaml中如何初始化数组类型的依赖属性
字段来支持公共语言运行时 (CLR) 属性,从而定义一个依赖项属性。当您定义自己的属性并需要它们支持 Windows Presentation Foundation (WPF) 功能的诸多方面(包括样式、数据绑定、继承、动画和默认值)时,应将其实现为依赖项属性。
C# wpf 怎么注册枚举的依赖项属性
可以把枚举枚举定义在控件的CS类里 定义成public 然后属性类型就写定义的枚举类型就行
WPF启动动画时提示如下错误:“[Unknown]”属性未指向路径“(0).(1...
WPF里动画执行的属性是依赖项 比如如果你用的方法是xx.BeginAnimation()这种方法,那么,方法的第一个参数应该是比如 WidthProperty 如果是Stroyboard方式 那么应该是 new PropertyPath("Width")
WPF绑定与RelativeSource结合使用
本文揭示了在WPF中结合使用StaticResources、DynamicResources与RelativeSource进行属性绑定的多种具体应用场景。RelativeSource标记扩展在自定义控件开发和处理一系列绑定数据时,用于将依赖属性值绑定到XAML的特定元素。接下来,我们将深入探讨几种关键的RelativeSource用法。首先,考虑一个矩形,其高度始终等于宽度的...
通过Demo学WPF—数据绑定(一)✨
再来看看Path,表示绑定源属性的路径,Path="PersonName"表示绑定源是刚刚那个Person对象的PersonName属性。最后再看看UpdateSourceTrigger属性,它表示当绑定目标怎么样时,绑定源的值应该被更新。在SimpleBindingDemo中,我们设置UpdateSourceTrigger属性为PropertyChanged,这是因为大多数依赖项属性的默认值为...
WPF完全揭秘目录
第2章详细解析了XAML的使用,包括元素的子元素、内容属性和集合项,以及性能上的讨论。逻辑树和可视树的概念在第3章中引入,依赖属性、路由事件和命令是WPF的重要新概念,它们使得应用程序设计更加灵活和高效。第4章至第14章分别介绍了WPF控件、尺寸缩放、布局、数据绑定、样式与多媒体功能,让应用更具...