Wpf 我们如何设置包装的包装点?
我有一个ItemsControl,希望将数据输入到两列中。当用户调整到小于第二列的宽度时,第二列的项目必须换行到第一列中。类似于UniformGrid但带有包装的东西 我已经设法用包装纸来做这件事。但是我不得不对包装面板的ItemWidth和MaxWidth进行操作和硬编码,以实现两列和包装。这不是一个好的做法 是否有设置最大列数的方法,或者换句话说,允许我们决定WrapPanel应该在什么时候开始包装 一些浏览互联网的人透露,Windows8Metro中的WrapGrid有这样的功能。有人在WPF中有这样的实现吗?codeproject.com上有一篇文章,我对其进行了修改,以确保包裹面板中的项目具有统一的宽度并适合窗口的宽度。您应该能够轻松地修改此代码,使其具有最大列数。尝试在附近更改代码Wpf 我们如何设置包装的包装点?,wpf,word-wrap,wrappanel,uniformgrid,Wpf,Word Wrap,Wrappanel,Uniformgrid,我有一个ItemsControl,希望将数据输入到两列中。当用户调整到小于第二列的宽度时,第二列的项目必须换行到第一列中。类似于UniformGrid但带有包装的东西 我已经设法用包装纸来做这件事。但是我不得不对包装面板的ItemWidth和MaxWidth进行操作和硬编码,以实现两列和包装。这不是一个好的做法 是否有设置最大列数的方法,或者换句话说,允许我们决定WrapPanel应该在什么时候开始包装 一些浏览互联网的人透露,Windows8Metro中的WrapGrid有这样的功能。有人在W
var itemsPerRow = (int) (totalWidth/ItemWidth);
以指定最大列数
代码如下:
public enum ItemSize
{
None,
Uniform,
UniformStretchToFit
}
public class UniformWrapPanel : WrapPanel
{
public static readonly DependencyProperty ItemSizeProperty =
DependencyProperty.Register(
"ItemSize",
typeof (ItemSize),
typeof (UniformWrapPanel),
new FrameworkPropertyMetadata(
default(ItemSize),
FrameworkPropertyMetadataOptions.AffectsMeasure,
ItemSizeChanged));
private static void ItemSizeChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var uniformWrapPanel = sender as UniformWrapPanel;
if (uniformWrapPanel != null)
{
if (uniformWrapPanel.Orientation == Orientation.Horizontal)
{
uniformWrapPanel.ItemWidth = double.NaN;
}
else
{
uniformWrapPanel.ItemHeight = double.NaN;
}
}
}
public ItemSize ItemSize
{
get { return (ItemSize) GetValue(ItemSizeProperty); }
set { SetValue(ItemSizeProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
var mode = ItemSize;
if (Children.Count > 0 && mode != ItemSize.None)
{
bool stretchToFit = mode == ItemSize.UniformStretchToFit;
if (Orientation == Orientation.Horizontal)
{
double totalWidth = availableSize.Width;
ItemWidth = 0.0;
foreach (UIElement el in Children)
{
el.Measure(availableSize);
Size next = el.DesiredSize;
if (!(Double.IsInfinity(next.Width) || Double.IsNaN(next.Width)))
{
ItemWidth = Math.Max(next.Width, ItemWidth);
}
}
if (stretchToFit)
{
if (!double.IsNaN(ItemWidth) && !double.IsInfinity(ItemWidth) && ItemWidth > 0)
{
var itemsPerRow = (int) (totalWidth/ItemWidth);
if (itemsPerRow > 0)
{
ItemWidth = totalWidth/itemsPerRow;
}
}
}
}
else
{
double totalHeight = availableSize.Height;
ItemHeight = 0.0;
foreach (UIElement el in Children)
{
el.Measure(availableSize);
Size next = el.DesiredSize;
if (!(Double.IsInfinity(next.Height) || Double.IsNaN(next.Height)))
{
ItemHeight = Math.Max(next.Height, ItemHeight);
}
}
if (stretchToFit)
{
if (!double.IsNaN(ItemHeight) && !double.IsInfinity(ItemHeight) && ItemHeight > 0)
{
var itemsPerColumn = (int) (totalHeight/ItemHeight);
if (itemsPerColumn > 0)
{
ItemHeight = totalHeight/itemsPerColumn;
}
}
}
}
}
return base.MeasureOverride(availableSize);
}
}
我想这就是
WrapPanel
的工作原理。。。绘制每个项目,直到下一个项目不适合,然后换行。您应该使用ItemWidth
和WrapPanel.Width
(或MaxWidth
)来告诉WrapPanel
何时包装。太棒了!谢谢你,菲尔。我设法根据我的要求定制了这个。顺便说一句,使用WrapPanel有没有性能问题?我不能说性能。大约30-40个项目似乎可以使用。你需要试一试。