c# - 影响量度或影响量程



wpf layout (1)

我正在创建自定义控件,如果其中一个依赖属性更改,我需要更新布局。 我可以使用FrameworkMetadataProperty.AffectsMeasureFrameworkMetadataProperty.AffectsArrange

问题1 - 我很困惑使用哪一个。

此外,我也可以使用UpdateLayout和InvalidateVisual方法以更新UI。

问题2 - 所有这4件事情看起来都很相似,并且在什么时候使用这个东西感到困惑?


首先,将FrameworkPropertyMetadataOptions和调用方法设置为UpdateLayout或InvalidateVisual的区别很明显。 在后一种情况下,您可以在控制代码中调用这些方法,而在前一种情况下,框架将调用适当的方法。

AffectsMeasureAffectsArrange之间的区别仅仅在于调用UIElement.InvalidateMeasure (“影响布局的度量传递”),另一个结果是调用UIElement.InvalidateArrange (“影响布局的布局传递” )。

UIElement.Measure中的说明可以看出差异:

当一个布局第一次实例化时,它总是在Arrange之前接收一个Measure调用。 但是,在第一个布局过后,它可能会收到一个没有度量的编配调用; 当仅影响“排列”的属性发生更改(如排列)时,或者父母收到“排列”时,可能会发生这种情况。 测量呼叫将自动使编配呼叫无效。

并从UIElement.InvalidateMeasure中的说明:

调用此方法在内部也会调用InvalidateArrange,因此不需要连续调用InvalidateMeasure和InvalidateArrange

更新:有关UpdateLayout和InvalidateVisual之间的差异,请参阅UpdateLayout中的备注:

当您调用此方法时,IsMeasureValid为false或IsArrangeValid为false的元素将调用特定于元素的MeasureCore和ArrangeCore方法,这将强制布局更新,并且所有计算的大小都将进行验证。

如果布局不变,或者布局的布置和测量状态均无效,则调用此方法不起作用。 但是,如果布局在任何方面都是无效的,那么UpdateLayout调用将会重做整个布局。 因此,您应该避免在元素树中进行每次增量和次要更改之后调用UpdateLayout。 布局系统将以延迟的方式执行元素布局,使用平衡性能和货币的算法,并使用权重策略推迟对根的更改,直到所有子元素都有效。 如果您绝对需要更新的大小和位置,并且只有在您确定已完成对您控制的属性的所有更改并且可能会影响布局的情况下,才应该只调用UpdateLayout。

并在InvalidateVisual

这个方法在内部调用InvalidateArrange。

通常不会从您的应用程序代码中调用此方法。 WPF框架级布局系统自己处理一个元素的可视化树中的变化,并且在必要的时候会调用这个方法的等价物。 调用此方法仅适用于高级方案。 一种这样的高级场景是,如果为不属于Freezable或FrameworkElement派生类的依赖项属性创建PropertyChangedCallback,而该派生类在更改时仍会影响布局。





layout