如何将自定义面板中的子元素强制为特定大小?
How do you force children elements in a custom panel to a particular size?
我在一个面板中有一堆高度相同的项目。我希望面板中的项目根据面板本身的最大宽度缩小宽度。
例如 - 面板的宽度为 400,面板中有 4 个项目,每个项目的宽度为 100。如果是 2 个项目,则每个项目的宽度为 200。
第二次使用项目的预期宽度调用 child.Measure
后,child.DesiredSize
完全变为其他内容。我如何强制项目采用我给它的宽度?
public class DynamicShrinkPanel : StackPanel
{
public DynamicShrinkPanel()
{
}
protected override Size MeasureOverride(Size constraint)
{
Size desiredSize = new Size();
foreach (UIElement child in InternalChildren)
{
// First call to get the desired size.
child.Measure(constraint);
double properChildWidth = constraint.Width / InternalChildren.Count;
// Second call to set what I want, doesn't do what I expect
child.Measure(new Size(properChildWidth, child.DesiredSize.Height));
desiredSize.Height = child.DesiredSize.Height;
desiredSize.Width += child.DesiredSize.Width;
}
return desiredSize;
}
}
我想出来了,不要使用 MeassureOverride
来计算确切的大小,而是使用 ArrangeOverride
方法。
protected override Size MeasureOverride(Size constraint)
{
Size desiredSize = new Size();
foreach (UIElement child in InternalChildren)
{
child.Measure(constraint);
desiredSize.Height = child.DesiredSize.Height;
desiredSize.Width = constraint.Width;
}
return desiredSize;
}
protected override Size ArrangeOverride(Size arrangeSize)
{
double offset = 0;
double properWidth = arrangeSize.Width / InternalChildren.Count;
foreach (UIElement child in InternalChildren)
{
child.Arrange(new Rect(offset, 0, properWidth, arrangeSize.Height));
offset += properWidth;
}
return arrangeSize;
}
我在一个面板中有一堆高度相同的项目。我希望面板中的项目根据面板本身的最大宽度缩小宽度。
例如 - 面板的宽度为 400,面板中有 4 个项目,每个项目的宽度为 100。如果是 2 个项目,则每个项目的宽度为 200。
第二次使用项目的预期宽度调用 child.Measure
后,child.DesiredSize
完全变为其他内容。我如何强制项目采用我给它的宽度?
public class DynamicShrinkPanel : StackPanel
{
public DynamicShrinkPanel()
{
}
protected override Size MeasureOverride(Size constraint)
{
Size desiredSize = new Size();
foreach (UIElement child in InternalChildren)
{
// First call to get the desired size.
child.Measure(constraint);
double properChildWidth = constraint.Width / InternalChildren.Count;
// Second call to set what I want, doesn't do what I expect
child.Measure(new Size(properChildWidth, child.DesiredSize.Height));
desiredSize.Height = child.DesiredSize.Height;
desiredSize.Width += child.DesiredSize.Width;
}
return desiredSize;
}
}
我想出来了,不要使用 MeassureOverride
来计算确切的大小,而是使用 ArrangeOverride
方法。
protected override Size MeasureOverride(Size constraint)
{
Size desiredSize = new Size();
foreach (UIElement child in InternalChildren)
{
child.Measure(constraint);
desiredSize.Height = child.DesiredSize.Height;
desiredSize.Width = constraint.Width;
}
return desiredSize;
}
protected override Size ArrangeOverride(Size arrangeSize)
{
double offset = 0;
double properWidth = arrangeSize.Width / InternalChildren.Count;
foreach (UIElement child in InternalChildren)
{
child.Arrange(new Rect(offset, 0, properWidth, arrangeSize.Height));
offset += properWidth;
}
return arrangeSize;
}