本质上我想要一个wrapPanel,但我希望项目能够捕捉到一个网格,而不是被按到左边,这样我就可以获得一个很好的统一外观网格,这会自动消耗可用空间。是否有WPF“WrapGrid”控件可用或创建一个简单的方法?
WrapPanel处理调整大小的部分。 WPF.Contrib.AutoGrid处理一个不错的自动网格。
任何人都得到了一个结合他们的控制?
我用例是我有一系列有点不规则形状的控制。我想他们会在尼斯列,以便在画布面板应捕捉到下一个“制表位”放置一个控制
本质上我想要一个wrapPanel,但我希望项目能够捕捉到一个网格,而不是被按到左边,这样我就可以获得一个很好的统一外观网格,这会自动消耗可用空间。是否有WPF“WrapGrid”控件可用或创建一个简单的方法?
WrapPanel处理调整大小的部分。 WPF.Contrib.AutoGrid处理一个不错的自动网格。
任何人都得到了一个结合他们的控制?
我用例是我有一系列有点不规则形状的控制。我想他们会在尼斯列,以便在画布面板应捕捉到下一个“制表位”放置一个控制
下面是一些代码,我掀起了基于一些是接近其他控件的。它做布局的体面工作,虽然它有一个问题,即盛大儿童控制不能填满所有可用空间。
protected override Size ArrangeOverride(Size finalSize)
{
double rowY = 0;
int col = 0;
double currentRowHeight = 0;
foreach (UIElement child in Children)
{
var initialSize = child.DesiredSize;
int colspan = (int) Math.Ceiling(initialSize.Width/ ColumnSize);
Console.WriteLine(colspan);
double width = colspan * ColumnSize;
if (col > 0 && (col * ColumnSize) + width > constrainedSize.Width)
{
rowY += currentRowHeight;
col = 0;
currentRowHeight = 0;
}
var childRect = new Rect(col * ColumnSize, rowY, width, initialSize.Height);
child.Arrange(childRect);
currentRowHeight = Math.Max(currentRowHeight, initialSize.Height);
col+=colspan;
}
return finalSize;
}
Size constrainedSize;
protected override Size MeasureOverride(Size constraint)
{
constrainedSize = constraint;
return base.MeasureOverride(constraint);
}
尝试设置WrapPanel的ItemWidth(或ItemHeight
)属性时:
<WrapPanel ItemWidth="48">
<TextBlock Text="H" Background="Red"/>
<TextBlock Text="e" Background="Orange"/>
<TextBlock Text="l" Background="Yellow"/>
<TextBlock Text="l" Background="Green"/>
<TextBlock Text="o" Background="Blue"/>
<TextBlock Text="!" Background="Violet"/>
</WrapPanel>
当我看了你的问题,我假设你想是这样的:
public class UniformWrapPanel : WrapPanel
{
protected override Size MeasureOverride(Size constraint)
{
if(Orientation == Orientation.Horizontal)
ItemWidth = Children.Select(element =>
{
element.Measure(constraint);
return element.DesiredWidth;
}).Max();
else
... same for vertical ...
return base.MeasureOverride(constraint);
}
}
但我看到别人已经实施了“UniformWrapPanel”,并从你的意见,你表示这并不是你所期待的。
我不明白的注释是:
我希望它不会迫使项目在给定的尺寸,但使用他们现有的大小,因此自动确定列宽
您能否举一个例子来说明您希望如何设计各种尺寸的东西?一张照片可能不错。你也提到“tabstop”,但不要给出任何定义。
UniformWrapPanel非常接近我想要的,除非我希望它不强制项目是一个给定的大小,但使用他们已经存在的大小,并因此自动确定列宽度 – 2010-06-09 20:10:55