C# 影响测量或影响范围

C# 影响测量或影响范围,c#,wpf,layout,C#,Wpf,Layout,我正在创建自定义控件,如果其中一个依赖项属性发生更改,我需要在其中更新布局。我可以使用FrameworkMetadataProperty.AffectsMeasure或FrameworkMetadataProperty.affectsRange Q.1-我不知道该用哪一个 此外,我还可以使用UpdateLayout和InvalidateVisual方法来更新UI Q.2-这四种方法看起来都很相似,我不知道应该使用哪一种方法?首先,设置方法和调用方法(如UpdateLayout或Invalidat

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

Q.1-我不知道该用哪一个

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


Q.2-这四种方法看起来都很相似,我不知道应该使用哪一种方法?

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

AffectsMeasure
AffectsRange
之间的区别在于,一个结果导致调用(“影响布局的测量过程”),另一个结果导致调用(“影响布局的排列过程”)

从以下内容的备注中可以清楚地看出区别:

当布局第一次被实例化时,它总是收到一个度量调用 在安排之前。但是,在第一个布局过程之后,它可能会收到 没有措施的安排电话;当一个属性 仅影响排列的更改(例如对齐)或 父级收到无度量值的排列。量度一下就可以了 自动使安排呼叫无效

从中可以看出:

调用此方法也会在内部调用InvalidateArrange 无需依次调用InvalidateMeasure和InvalidateArrange


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

调用此方法时,IsMeasureValid为false或IsArrangeValid为false的元素 将调用特定于元素的MeasureCore和ArrangeCore方法,强制 布局更新,将验证所有计算的尺寸

如果布局不变,或者 布局的排列和测量状态均无效。 但是,如果布局在这两方面都无效,则UpdateLayout调用 将重做整个布局。因此,你应该避免打电话 元素中每次增量和微小更改后的UpdateLayout 树。布局系统将以延迟方式执行元素布局 方式,使用平衡性能和货币的算法,以及 使用加权策略将对根的更改推迟到所有子项 元素是有效的。您应该仅在以下情况下调用UpdateLayout 绝对需要更新尺寸和位置,并且只有在您 确保对您控制的属性所做的所有更改 影响布局完成

以及:

此方法在内部调用InvalidateArrange

通常不会从应用程序代码中调用此方法。这个 WPF框架级布局系统自行处理 元素的可视树,并将调用 这种方法在必要时已经存在。调用此方法是必要的 仅适用于高级场景。一个这样的高级场景是 为以下依赖项属性创建PropertyChangedCallback: 不在仍然可用的Freezable或FrameworkElement派生类上 更改布局时影响布局


谢谢你,克莱门茨。你能建议什么时候使用UpdateLayout和InvalidateVisual吗?是否存在必须使用InvalidateVisual而不是UpdateLayout的情况?请参阅我的编辑。您只能在备注中提到的“高级场景”中使用InvalidateVisual。