真心不明白WPF依赖属性有什么作用
发布网友
发布时间:2022-04-08 01:51
我来回答
共2个回答
懂视网
时间:2022-04-08 06:12
比如:我们查看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-08 03:20
依赖属性相比于普通.net属性的区别就是依赖,故名思议,各种属性之间有依赖关系,而普通.net属性是没定义这种关系的。依赖属性在WPF内部的存储是某种成为“稀疏矩阵”的方式,可以大大减少属性占用的空间,提升程序性能。追问WPF 绑定数据一定要用 这种属性吗?
追答对的。
依赖属性是什么意思?
依赖属性的主要用途是在WPF界面中实现数据绑定和属性控制。比如,在一个按钮的IsEnabled属性依赖于一个CheckBox控件的IsChecked属性时,只需要在XAML中声明依赖属性关系,就可以实现数据绑定和自动更新。另外,在自定义控件中,依赖属性也是常用的技术手段,可以轻松实现自定义属性的扩展和控制。
如何理解WPF中的依赖项属性
5. 希望属性可进行动画处理。6. 希望属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。7. 希望使用已建立的、WPF 进程也使用的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。依赖对象创建时并不包含存储数据空间。WPF中必须使用依赖对象...
简单点说:wpf中依赖项属性与普通属性的异同
不是。依赖属性是要注册的,而且通常都是改变时候会触发类的响应。class a { int r;这是个属性,但是改变的时候不会发生什么,只是r的值变了。但是如果是一个控件的长,它改变的时候就会直接在ui表现出来,会立刻改变空间的长,这就是依赖属性,这样理解比较形象。} ...
在WPF中,依赖属性和附加属性之间有什么区别
其实属性就是对外暴漏接口罢了,注册依赖属性后就是给依赖属性赋值(set),或者问依赖属性取值(get),这些操作封装到了DependencyObject类里面,所有用过的属性的值都通过 List<EffectiveValueEntry> _effectiveValues = new List<EffectiveValueEntry>()来存储和维护。这样就不会污染最初的默认value。这里...
C#/WPF高手进!关于依赖属性、附加属性等声明方式以及静态构造函数、静态...
都是以静态的方式表现的。好处的话:可能是为了现绑定之类的功能吧,这块的源码真没注意过。为了共享属性的默认值。在定义依赖属性的时候会给一个默认值,平时大家用控件的时候,不会设置所有的值,用依赖项属性,如果不去设置,页面上所有的控件,都会共用这个值。现在想到的就这么多啦。
C# .NET面试系列五:WPF
依赖属性是WPF的特性,相比普通属性,它支持值计算、资源系统集成等,用于优化性能和资源管理,是数据绑定、样式和动画的关键。WPF中的样式和模板允许开发者定制控件外观、布局,提供了高度的灵活性。而数据绑定则深入到控件、路径、双向绑定以及转换器等细节中。Visual、UIElement、FrameworkElement和Control在...
WPF和Silverlight的具体区别?
依赖关系属性是两个平台的重要组成部分,使用PropertyMetadata可代替普通字段来保存属性。Silverlight仅提供了该类,而WPF却有若干子类型可用。UIPropertyMetadata添加了一个标识符,用于决定“在使用了元数据实例的地方,是否应该禁播依赖关系属性的动画”FrameworkPropertyMetadata添加一个标识符来指示影响管道的那些...
WPF上位机自定义控件系列:表格 WxDataGrid 功能增强版
为了实现行号,我们尝试了两种策略。一是设计DataGridRowHeader的样式,通过一个转换器将DataGridRow转换为行号指示。这种方法的优点在于直观,但有一个局限:当数据删除时,行号不会自动更新。第二种方法是利用依赖属性,这种方法更为灵活,能够确保数据删除时行号的实时更新,特别是在LoadingRow和UnloadingRow...
WPF基础教程之属性系统
依赖项属性 一个由 DependencyProperty 支持的属性 依赖项属性标识符 一个 DependencyProperty 实例 在注册依赖项属性时作为返回值获得 之后将存储为一个类成员 在与 WPF 属性系统交互的许多 API 中 此标识符用作一个参数 CLR 包装 属性的实际 get 和 set 实现 这些实现通过在 GetValue 和 SetValue ...
WPF中的DependencyProperty和普通类中的属性有何区别
普通属性就不行。给你些链接做参考吧:http://www.silverlightchina.net/html/study/WPF/2012/1009/19341.html http://www.silverlightchina.net/html/study/WPF/2012/0824/18357.html http://www.silverlightchina.net/html/study/WPF/2012/0308/14354.html 希望对你有用!~...