我正在创建自定义控件,如果依赖项属性之一发生更改,我需要更新布局。我可以使用FrameworkMetadataProperty.AffectsMeasure
or FrameworkMetadataProperty.AffectsArrange
.
Q.1- 我很困惑该使用哪一个。
此外,我还可以使用 UpdateLayout 和 InvalidateVisual 方法来更新 UI。
Q.2- 所有这 4 个东西看起来都很相似,但我很困惑何时使用哪一个?
一、设置的区别框架属性元数据选项调用 UpdateLayout 或 InvalidateVisual 方法是显而易见的。在后一种情况下,您在控制代码中调用这些方法,而在前一种情况下,框架将调用适当的方法。
和...之间的不同AffectsMeasure
and AffectsArrange
只是导致调用UIElement.InvalidateMeasure(“影响布局的测量通道”),另一个结果是调用UIElement.InvalidateArrange(“影响布局的排列通道”)。
从注释中可以清楚地看出差异UIElement.Measure:
当布局首次实例化时,它总是会收到 Measure 调用
在安排之前。然而,在第一次布局之后,它可能会收到
没有 Measure 的 Arrange 调用;当财产
仅影响排列更改(例如对齐),或者当
父级收到一个没有测量的安排。 Measure 调用将
自动使 Arrange 调用无效。
以及来自中的备注UIElement.InvalidateMeasure:
调用该方法内部也会调用InvalidateArrange,有
无需连续调用InvalidateMeasure和InvalidateArrange
更新:有关UpdateLayout和InvalidateVisual之间的区别,请参阅中的备注更新布局:
调用此方法时,IsMeasureValid false 或 IsArrangeValid false 的元素
将调用特定于元素的 MeasureCore 和 ArrangeCore 方法,这会强制
布局更新,所有计算的尺寸都将得到验证。
如果布局未更改,或者如果
布局的排列和测量状态均无效。
但是,如果布局在任一方面都无效,则 UpdateLayout 调用
将重做整个布局。因此,您应该避免致电
在元素中每次增量和微小更改后更新布局
树。布局系统将在延迟中执行元素布局
方式,使用平衡性能和货币的算法,以及
使用加权策略推迟对根的更改,直到所有子项
元素有效。您应该仅在以下情况下调用 UpdateLayout
绝对需要更新尺寸和位置,并且只有在您
确保对您控制的属性进行的所有更改都可能
影响布局完成。
and in 无效视觉:
该方法内部调用InvalidateArrange。
通常不会从应用程序代码中调用此方法。这
WPF 框架级布局系统自行处理更改
元素的视觉树,并且将调用等效的
必要时可以使用此方法。调用这个方法是必要的
仅适用于高级场景。一种这样的高级场景是,如果您是
为依赖属性创建 PropertyChangedCallback
不在仍然存在的 Freezable 或 FrameworkElement 派生类上
更改时会影响布局。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)