听起来你想要一个布局:
- 每行有固定数量的单元节点。
- 每个单元节点具有相同的高度和宽度。
我不熟悉 WPF 或 UniformGrid,但我认为以上是您想要的。
TilePane 可能不太适合
看起来TilePane很适合这个,但是,正如您所发现的,它并没有真正表现出这种开箱即用的行为。使用 TilePane,您可以设置首选的行数,但是当您调整 TilePane 的大小时,行数和列数会随着瓷砖重新排列以适应可用区域而改变。
使用具有绑定和首选项设置或约束的 GridPane
要获得每行固定数量的单元格,请使用GridPane。GridPane 在调整大小时将保持固定数量的行和列。为确保每个单元格节点具有相同的高度和宽度,您可以监听 GridPane 的高度和宽度属性,并在更改时设置子元素的最小/最大/首选大小,以便它们都具有相同的大小. 或者对 GridPane 的行和列设置一些约束,例如setPercentWidth和setPercentHeight。
为了演示这种方法,ColorChooser 示例为可调整大小的ColorChooser 提供了一些代码,每个网格行具有固定数量的颜色样本,并且随着包含网格的整体增长或缩小,颜色样本会增长和缩小以适应可用区域:合适的。颜色样本本身不一定保持相同的高度/宽度比,但您可以通过在子元素上设置适当的最小/最大/首选大小轻松实现这一点。
创建自己的布局
作为使用更改侦听器和在子级上设置最小/最大/首选大小的替代方法,您可以通过将Pane子类化以创建 UniformGrid 类并实现layoutChildren方法来实现自己的布局管理器。在 layoutChildren 中,根据需要排列 UniformGrid 子项的大小和位置。您可以参考现有 Pane 的源代码来查找如何创建自己的布局的示例。
调查第 3 方布局
ControlsFX 项目有一个GridView或MigLayout,它们可能提供 UniformGrid 的功能。