【问题标题】:MeasureOverride does not work on CanvasMeasureOverride 在画布上不起作用
【发布时间】:2014-08-06 07:46:34
【问题描述】:

我需要更改放置在 Canvas 上的 Rectangle 大小,所以我继承了 Canvas 类来使用 MeasureOverride:

public class CustomCanvas : Canvas
{
    public CustomCanvas() : base(){}

    protected override Size MeasureOverride(Size availableSize)
    {
        Size canvasDesiredSize = new Size();

        foreach (UIElement child in Children)
        {
            child.Measure(new Size(300, 300));
            canvasDesiredSize = child.DesiredSize;
        }

        return canvasDesiredSize;
    }
}

并使用它:

<local:CustomCanvas Width="500" Height="800" Background="Gray">
        <Rectangle Fill="AliceBlue" Height="100" Width="100"/>
    </local:CustomCanvas>

但在执行后,矩形仍然是 100,100 大小(在 XAML 中指定)。当child.Measure(new Size(300, 300)); 执行时child.DesiredSize 显示0,0。那里发生了一些奇怪的事情。

我使用this 作为参考。

【问题讨论】:

  • 尽管child.DesiredSize 显示 100,100(如在 XAML 中),但我已尝试在 Panel 控件上执行完全相同的操作,但 Rectangle 根本不可见。

标签: xaml windows-store-apps win-universal-app


【解决方案1】:

简短的回答是 Width 和 Height 会覆盖 Measure() 中给定的任何尺寸。

Microsoft 的文档缺少有关 Measure() 和 MeasureOverride() 之间数据流的重要信息。

容器调用Child.Measure()
Measure()调用MeasureCore()
MeasureCore()调用MeasureOverride()

Measure 是 UIElement 的一个方法。
MeasureCore是FrameworkElement的一个方法,继承自UIElement。 MeasureOverride 是 FrameworkElement 的一种方法。 MeasureOverride 被孩子覆盖。

UIElement.Measure(avialableSize) 在调用MeasurementCore() 之前执行以下操作:

  • 如果 avialableSize IsNan,宽度和高度都抛出异常
  • 如果 UIElement 被折叠,MeasureCore 将不会被调用
  • 如果 availableSize 没有改变,MeasureCore 将不会被调用,除非 InvalidateMeasure 之前被调用过
  • 调用 InvalidateArrange

FrameworkElement.MeasurementCore(availableSize) 在调用MeasureOverride() 之前执行以下操作:

  • 从 availableSize 中删除 Margin
  • 在 availableSize 上强制执行 height、minHeight 和 maxHeight,对于 witdh 属性也是如此

调用MeasureOverride()后,MeasurementCore()调整MeasureOverride()返回的值计算DesiredSize:

  • DesiredSize 必须在 MinWidth 和 MaxWidth 范围内
  • 为 DesiredSize 添加边距

调用FrameworkElement.MeasurementCore()后,UIElement.Measure()执行:

  • 如果返回宽度或高度为无限则抛出异常
  • 如果返回宽度或高度为NaN,则抛出异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2016-05-22
    • 2020-08-29
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多