将内容包装成最多两列的WPF。均匀分布。

3
我正在尝试在我的WPF应用程序中插入一个面板,它需要具备以下几个特定的行为:
1. 均匀地包裹内容。从左上角开始向下运行,然后移动到下一列。
2. 允许我定义要换行的最大列数。对于我的目的,此数字将介于1和3之间。
3. 允许我设置初始高度,但也会增长以适应其他项目。(只设置初始高度,因为如果不设置的话,我的内容就无法换行。如果我把它设置为自动,它会在屏幕上是否适合单列输出)
目前,我得出结论,我所尝试做的将需要一个自定义面板,但在我开始这个过程(和学习如何做到这一点)之前,我想确保我没有错过更简单的答案。

将包装面板的宽度绑定到[子项模板宽度] x [所需列数]。 - Franck
1
尝试在这里查看:https://dev59.com/HGYr5IYBdhLWcg3wG2tJ - stsur
2个回答

1

WrapPanel 可以设置垂直换行,但您无法控制列数。

UniformGrid 可以控制列数,但是水平换行而不是垂直。

简而言之:您需要一个自定义面板。内置的面板不能提供您想要的功能组合。


您可以通过Wrap Panel有效控制列数。只需在Wrap Panel的宽度上创建一个Multi Converter,使用子模板实际宽度和ViewModel中的列数值即可。在Converter中,宽度返回值= TemplateActualWidth x ColumnQuantity。我在自定义的"我的电脑风格"窗口中已经完美实现了这个功能。 - Franck
@Franck 这有点像是一个hack,但显然对你有效。我仍然建议OP编写自定义面板。 - Steven Rands
我不喜欢编写一个全新的控件,只在一个地方使用,需要我花费半天时间来思考、编写和测试。相比之下,我可以在已有的控件上使用一个5行转换器,在5分钟内获得我想要的精确结果。 - Franck
@Franck,这很公平,我非常相信在可能的情况下重复使用现有的控件和面板,尽管我并不确定你的解决方案是否能够满足所有OP的要求。不过我承认我没有太多考虑。也许你可以在回答中发布你的解决方案,这可能对OP有用。 - Steven Rands
由于垂直方向是您要设置的实际值,因此您需要将包装的高度设置为子项的高度乘以列数。换句话说,如果包装面板中的项目为100个单位,您想要3列,并且您有28个项目,则希望包装的高度强制执行2个包装以提供3列。如果将包装的高度设置为200,则每列将获得2个项目(每个项目100),这将生成14个由wrappanel生成的列,因此不好。您需要使用 Math.Ceiling(ItemQty / ColumnRequired) * ItemHeight = Ceiling(28 / 3) * 100 = 10 * 100 = 1000 来获得3列。 - Franck
显示剩余2条评论

0

UniformGrid有一个LayoutTransform属性,可以用来转换它以改变内部元素的位置/旋转。但它也会转换内容。

一些更多的技巧涉及到在UniformGrid中设置Setters和项目类型,内容可以再次转换以保留所需的“原始”方向。

您可以在本教程中了解更多信息。

或者,似乎扩展WPF工具包包含其自己的UniformGrid实现,具有方向属性,唯一的问题是它不会随着项目数量增加而增长;相反,它将遵守任意的属性。

然而,您可能能够在每次添加新项/调整UniformGrid大小时更改此属性的值,但这将需要一些手动工作,并且可能会导致代码后台,如果您正在MVVM中工作,则可能被视为问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接