代码之家  ›  专栏  ›  技术社区  ›  Page

如何构建带有重复标题的分页项控件或面板?

  •  1
  • Page  · 技术社区  · 17 年前

    我正在尝试构建一个面板或ItemsControl,它将以以下形式显示项目:

    标题1

    • 分项目1
    • 分项目2
    • 分项目3

    标题2

    • 分项目1
    • 分项目2

    这很容易,但这里的问题是,我需要能够以分页方式拆分项目。根据控件的高度,任何不合适的内容都将出现在下一页(以此类推)。如果子项之间发生拆分,我也需要在下一页上重新显示相应的标题。

    我在MeasureOverride和ArrangeOverride方面取得了一些进展,但我一直走到死胡同。这真的很令人沮丧,因为在WPF/Silverlight中,这在计算上很琐碎,但却是一场噩梦。如果您曾经使用过报告包,那么这个概念与此非常相似。

    我一直回到这样一个事实:在我将孩子添加到控件(使用Dispatcher.BeginInvoke)之前,我无法确定高度。

    有人对实现这一点有什么建议吗?提前谢谢!


    编辑

    [WPF] ObservableCollection and ListBoxItem DataTemplate generation problem

    上面的链接与mdm20的建议非常相似,但我仍然被卡住了。每次我尝试获取实际高度时,它都返回0。此外,Silverlight 3中的ItemContainerGenerator会为容器返回null,除非我将调用包装到Dispatcher中。开始手术。

    2 回复  |  直到 9 年前
        1
  •  0
  •   mdm20    17 年前

    如果我必须实现这一点,我不认为我会尝试在一个小组中实现它。我认为您需要一个项目集合、一个标题模板、一个页面模板和一个项目模板。您可以使用以下方法获得模板的高度:

        Size maxSize = new Size(0, 30);
        UIElement templateRoot = template.LoadContent() as UIElement;
        templateRoot.Measure(maxSize);
        Size size = templateRoot.DesiredSize;
    

    不过,你需要在模板中指定一个高度,这样才能工作。我想你只关心高度,所以我留下了宽度0。

    一旦你得到了模板的高度,你可能需要建立某种地图来跟踪哪些对象在哪一页上。每次大小更改或项目源更改时,都必须重新创建此文件。

    之后,您只需根据您的页面,将项添加为控件中包含的面板的子项。

    这就是我要努力做到的。。如果这有任何意义的话:)

        2
  •  0
  •   PeterAllenWebb    17 年前

    确实不可能直接测量 UIElement 在构建它之前,您可能能够以这样一种方式构建列表元素,即您将提前知道它们将占用多少空间。例如,你可以使用 Grid 以一行已知高度(例如 headerHeight )对于每个子项的标题和已知高度的行(例如 subitemHeight ).然后你可以用这个公式计算每个元素的高度 头球 + numSubitems * 子项高度 。此外,如果您知道项目的数量非常少,比如说少于1000个,那么您可能只想提前创建它们,因为此时性能损失可能是可以忍受的。

    我同意这类事情可能很烦人,但正是框架的灵活性造成了问题。这个高度计算问题使得在ListBox或ListView中平滑滚动(但仍然是虚拟化的)项目列表变得非常困难。