我需要改变放置在画布上的矩形大小,所以我继承了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作为参考。
发布于 2015-01-17 16:45:30
简而言之,宽度和高度会覆盖Measure()中给定的任何大小。
微软的文档缺少有关Measure()和MeasureOverride()之间数据流的重要信息。
容器调用Child.Measure()
Measure()调用MeasureCore()
MeasureCore()调用MeasureOverride()
测量是UIElement的一种方法。
MeasureCore是FrameworkElement的一种方法,继承自UIElement。MeasureOverride是FrameworkElement的一种方法。MeasureOverride被子级重写。
在调用MeasurementCore()之前,UIElement.Measure(avialableSize)会执行以下操作
在调用MeasureOverride()之前,FrameworkElement.MeasurementCore(availableSize)会执行以下操作
对于witdh properties,
调用MeasureOverride()后,MeasurementCore()会调整MeasureOverride()的返回值,计算出DesiredSize:
在调用FrameworkElement.MeasurementCore()之后,UIElement.Measure()执行:
如果return width或height为Infinite
,将抛出异常
https://stackoverflow.com/questions/25154902
复制相似问题