【问题标题】:writing a grid that has both column and row virtualization编写具有列和行虚拟化的网格
【发布时间】:2011-09-20 02:16:30
【问题描述】:

我需要编写一个类似 excel 的网格,它可以有很多单元格 (400x400)。所有列的宽度相同,所有行的高度相同。每个单元格可以包含文本或为空,每个单元格可以有一个列和/或行跨度。我想这永远不会与Grid 面板一起工作,我想我需要在列和行方向上进行 UI 虚拟化。

所以我的第一次尝试是通过从VirtualizingPanel 派生并实现IScrollInfo 创建一个虚拟化网格。除了我遇到问题之外,这可能“很容易”成为解决方案:

为了向IScrollInfo 提供有关滚动大小和位置的相关信息,并能够确定接下来需要使用 ItemsContainerGenerator 创建(实现)哪些项目,我需要知道列索引、行索引和列跨度每个子项(单元格)。我能想到的唯一方法是使用附加属性。问题是:如果已经实现了具有附加属性的 ItemContainer,我只能读取附加属性的值。所以我在这里遇到了 22 个问题。要知道要实现什么,我需要实现所有项目。要为IScrollInfo 提供数据,我需要实现所有项目。

因此,我似乎在这种方法中处于死胡同。

您知道如何实现这样的控件或知道如何解决上述问题吗?

【问题讨论】:

  • 您提到每行具有相同的高度,每列具有相同的宽度。似乎可以进行计算以计算滚动数据。您能否进一步解释为什么这会带来挑战?
  • 是的,可以计算滚动数据。问题:网格中的任何地方都可能存在具有任意列和/或行跨度的单元格。我已经更新了我的问题。所以在滚动时,有时一个单元格不能完全适应当前视口。此外,我希望利用虚拟化技术,因为单元格可以拥有项目数据模板,这些模板绑定到单元格的视图模型,只有在它进入视图时才能实现。

标签: wpf grid virtualization


【解决方案1】:

令我震惊的是,您可能不需要自己实例化 UI 元素 - 您可以非常轻松地拥有一组 DependencyObject 派生的视图模型,每个视图模型都设置了 WidthProperty 和 HeightProperty(并且可能绑定到等效的 Width 和 Height可见单元格 UI 元素的属性(一旦创建)。

存储 160,000 (400x400) 个类实例应该不是问题,尤其是当您能够使用行和列对集合进行索引时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 2011-09-08
    • 2018-03-04
    • 2018-09-22
    • 2017-10-05
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多