我需要更改放置在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作为参考。
答案 0 :(得分:1)
简短的回答是宽度和高度覆盖了Measure()中给出的任何大小。
Microsoft的文档缺少有关Measure()和MeasureOverride()之间数据流的重要信息。
容器调用Child.Measure()
Measure()
致电MeasureCore()
MeasureCore()
来电MeasureOverride()
措施是UIElement的一种方法 MeasureCore是FrameworkElement的一种方法,它继承自UIElement。 MeasureOverride是FrameworkElement的一种方法。 MeasureOverride被孩子覆盖。
在调用UIElement.Measure(avialableSize)
之前, MeasurementCore()
执行以下操作:
FrameworkElement.MeasurementCore(availableSize)
之前, MeasureOverride()
执行以下操作:
调用MeasureOverride()
后,MeasurementCore()
会调整MeasureOverride()
返回的值来计算DesiredSize:
致电FrameworkElement.MeasurementCore()
后,UIElement.Measure()
执行: