MeasureOverride不适用于Canvas

时间:2014-08-06 07:46:35

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

我需要更改放置在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作为参考。

1 个答案:

答案 0 :(得分:1)

简短的回答是宽度和高度覆盖了Measure()中给出的任何大小。

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

容器调用Child.Measure()
Measure()致电MeasureCore() MeasureCore()来电MeasureOverride()

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

在调用UIElement.Measure(avialableSize)之前,

MeasurementCore()执行以下操作:

    如果avialableSize IsNan(宽度和高度都),则
  • 抛出异常
  • 如果UIElement折叠,则不会调用MeasureCore
  • 如果availableSize没有改变,除非在之前调用InvalidateMeasure,否则不会调用MeasureCore
  • 调用InvalidateArrange
在调用FrameworkElement.MeasurementCore(availableSize)之前,

MeasureOverride()执行以下操作:

  • 从availableSize
  • 中移除保证金
  • 对availableSize强制执行height,minHeight和maxHeight,并对witdh属性执行相同的操作

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

  • DesiredSize必须在MinWidth和MaxWidth
  • 之内
  • 为DesiredSize添加保证金

致电FrameworkElement.MeasurementCore()后,UIElement.Measure()执行:

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