我创建了一个名为LinearLayout的新Panel,并且管理Layouting我遇到了问题,因为在调用MeasureOverride方法后没有设置字段desiredSize ...这是我的代码:
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("Measure" + ((FrameworkElement)elemento).Name);
((FrameworkElement)elemento).Measure(new Size(((FrameworkElement)elemento).Width, ((FrameworkElement)elemento).Height));
System.Diagnostics.Debug.WriteLine(" child this desireddSIze" + ((FrameworkElement)elemento).DesiredSize);
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).DesiredSize.Width;
}
}
}
return panelDesiredSize;
}
我正在嵌套两个线性布局:L1是L2的父级,L2是3个按钮的父级。
有趣的是,如果我在类LinearLayout中的任何地方编写代码它可以工作,并且再次调用Layout机制并且它工作正常..但是如果我调用UpdateLayout()没有任何反应并且机制不是激活(不调用measureoverride和arrangeoverride)
this.Width = finalSize.Width;
this.Height = finalSize.Height;
这是一个错误吗?还是只是我???我已经有两天了,似乎对其他人都有用...... 如果有人可以帮助我,我将非常感激! 顺便说一句,我正在使用Silverlight for Windows Phone 7 ...
答案 0 :(得分:1)
测量阶段将设置DesiredSize属性,而不是宽度/高度属性。 Width / Height属性用于为元素提供显式大小,而不是自动拟合其内容(即通过MeasureOverride)。
您不应根据度量或排列阶段的结果设置宽度/高度,因为度量和排列阶段使用这些属性来确定最佳大小。
UpdateLayout并不意味着强制元素重新测量/重新排列。您需要使用InvalidateMeasure或InvalidateArrange来执行该任务。
编辑:
此代码行也不正确:
((FrameworkElement)elemento).Measure(new Size(((FrameworkElement)elemento).Width, ((FrameworkElement)elemento).Height));
你应该传入availableSize,或者你的面板想要给元素的任何大小。宽度/高度可能不是有效尺寸。
一般的经验法则是您的面板不应触及Width / Height / MinWidth / MinHeight / etc类型属性。它应该根据可用的大小传递可用的大小。或者,您可以在安排为元素提供所需空间时传递new Size(double.PositiveInfinity, double.PositiveInfinity)
。
在排列阶段,您可以使用element.DesiredSize来确定元素的排列矩形。