我想我已经理解了MeasureOverrride是如何工作的,但是我试图在一个非常简单的情况下使用它并且它不起作用...所以现在我不太确定...使用Measureoverride后我有吗也使用Arrageoverride或系统会为我做?情况是这样的:我有一个继承自Panel的LinearLayout类,它有两个名为wrapwidht和wrapheigh的字段,如果它们为true,则LinearLayout的宽度或高度必须与其子项所需的一样。所以我的Measureoveride看起来像:
protected override Size MeasureOverride(Size availableSize) {
Size panelDesiredSize = new Size();
if ((this.widthWrap) || (this.heightWrap))
{
foreach (UIElement elemento in this.Children)
{
System.Diagnostics.Debug.WriteLine(((FrameworkElement)elemento).DesiredSize.ToString());
if (this.Orientation.Equals(System.Windows.Controls.Orientation.Vertical))
{
if (this.widthWrap)
{
//the widest element will determine containers width
if (panelDesiredSize.Width < ((FrameworkElement)elemento).Width)
panelDesiredSize.Width = ((FrameworkElement)elemento).Width;
}
//the height of the Layout is determine by the sum of all the elment that it cointains
if (this.heightWrap)
panelDesiredSize.Height += ((FrameworkElement)elemento).Height;
}
else
{
if (this.heightWrap)
{
//The highest will determine the height of the Layout
if (panelDesiredSize.Height < ((FrameworkElement)elemento).Height)
panelDesiredSize.Height = ((FrameworkElement)elemento).Height;
}
//The width of the container is the sum of all the elements widths
if (this.widthWrap)
panelDesiredSize.Width += ((FrameworkElement)elemento).Width;
}
}
}
System.Diagnostics.Debug.WriteLine("desiredsizzeeeeeee" + panelDesiredSize);
return panelDesiredSize;
}
我对LinerLayout感兴趣的孩子是3个按钮,但没有画任何东西..即使panelDesiredSize字段是正确的...所以也许我不明白它是如何工作的。如果有人可以帮助我会很好: - )
答案 0 :(得分:2)
在与您类似的上一篇文章中查看我的回答:Two Pass Layout system in WPF and Silverlight
答案是不,你没有拥有来覆盖ArrangeOverride,但是如果你不打算使用ArrangeOverride,那么使用MeasureOverride的重点是什么?
答案 1 :(得分:0)
您应该在孩子身上调用Measure方法。请参阅此处的示例:http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx
答案 2 :(得分:0)
您必须在“elemento”上调用Measure。在Measure中,Silverlight创建了在elemento模板中声明的UI元素,因为它们需要实际测量并提出所需的大小。然后,您应该使用elemento.DesiredSize.Width和Height为panelDesiredSize提供所需的大小。