基本思想是您需要两个不同的滚动容器,一个包含固定列,另一个包含滚动列。 这些中的每一个都需要位于不同的视口中,因此标准的Grid / GridView不能很好地处理它 - 它们对滚动应该如何表现做出假设,因此简单地子类化一个或两个可能是相当复杂的。
相反,您可以构建两个网格,一个用于锁定列,一个用于滚动列。 每个人都可以处理他们自己的ColumnConfig类,绘制标题和行,并链接到同一个ListStore以确保他们的数据同步 - 商店中的更改将传递给两个监听网格。
为了获得完整的效果,需要一些额外的布线:
链接滚动。 从每个Grid收听BodyScrollEvent ,并将另一个滚动到同一个地方(仅更改top ,而不是left ,因为您不希望控制另一个)。
大小调整是第二大部分 - 两个网格都需要它们的可滚动高度相同,但是当实际显示滚动条时,水平滚动需要底部的缓冲区。 通常,Grid会根据其父级的指令进行调整,但有时您会直接调整Grid的大小 - 在这种情况下,不需要执行此步骤,只需稍微改变两个网格的大小。 否则,您需要构建布局以正确配置它。
最后,锁定的列需要隐藏其垂直滚动条 - 用户无需看到两个垂直滚动条。
这涵盖了基本用例,但没有处理替代GridView实现之类的事情 - GroupingView和子类将需要链接扩展(并隐藏组标题,以便它们不会出现两次,再加上处理组的事实当后半部分向侧面滚动时,行不应该被拆分), TreeGridView和TreeGrid将需要链接扩展节点并隐藏第二个网格中的树+/-图标。
为了避免混淆问题,我删除了该网格中的许多其他功能,例