影响测量或影响范围
本文关键字:影响 范围 测量 | 更新日期: 2023-09-27 17:54:38
我正在创建自定义控件,如果其中一个依赖属性发生变化,我需要更新布局。我可以用FrameworkMetadataProperty.AffectsMeasure
或者FrameworkMetadataProperty.AffectsArrange
。
Q。1 -我很困惑该使用哪一个。
此外,我还可以使用UpdateLayout和invalidatevvisuual方法,以及为了更新UI。
Q。2 -所有这4个东西看起来很相似,我不知道什么时候使用哪一个?
首先,设置FrameworkPropertyMetadataOptions和调用UpdateLayout或InvalidateVisual方法之间的区别是显而易见的。在后一种情况下,您可以在控制代码中调用这些方法,而在前一种情况下,相应的方法由框架调用。
AffectsMeasure
和AffectsArrange
之间的区别仅仅是一个导致调用UIElement。invalidatemmeasure("影响布局的度量传递"),另一个结果是调用UIElement。InvalidateArrange("影响布局的排列传递").
从UIElement中的备注中可以看出区别。措施:
当布局第一次实例化时,它总是接收一个度量调用在安排之前。然而,在第一次布局通过后,它可能会收到无措施地安排电话;这可能发生在属性更改了仅影响Arrange的属性(例如对齐),或者家长收到一个没有度量的安排。Measure call将自动使Arrange调用无效
和来自元素中的备注。InvalidateMeasure:
调用这个方法也在内部调用InvalidateArrange,有不需要连续调用invalidatemmeasure和InvalidateArrange
UPDATE:对于UpdateLayout和InvalidateVisual之间的差异,请参见UpdateLayout:
中的备注当你调用这个方法时,IsMeasureValid或IsArrangeValid的元素为假将调用特定于元素的MeasureCore和ArrangeCore方法,这迫使布局更新,所有计算大小将被验证。
如果布局未改变,则调用此方法不起作用布局的排列和测量状态都无效。然而,如果布局在任何方面无效,UpdateLayout调用将重做整个布局。因此,你应该避免打电话UpdateLayout在元素的每个增量和小更改之后树。布局系统将以延迟的方式执行元素布局方式,使用平衡性能和货币的算法,以及使用加权策略将对根的更改推迟到所有子节点元素是有效的。你应该只调用UpdateLayout,如果你绝对需要更新尺寸和位置,只有在你确定所有对您控制的属性的更改影响布局是否完成
和InvalidateVisual:
这个方法内部调用InvalidateArrange。
此方法通常不会从应用程序代码中调用。的WPF框架级布局系统自己处理可视树中的一个元素,将调用等价的这种方法在必要时就已经存在了。调用这个方法是必要的仅适用于高级场景。一个这样的高级场景是,如果你是为依赖项属性创建PropertyChangedCallback而不是在Freezable或FrameworkElement派生类上当它改变时影响布局。