【问题标题】:How do I build a paged ItemsControl or Panel with a repeating header?如何构建带有重复标题的分页 ItemsControl 或 Panel?
【发布时间】:2012-05-11 06:22:34
【问题描述】:

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

标题 1

  • 子项 1
  • 子项 2
  • 子项 3

标题 2

  • 子项 1
  • 子项 2

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

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

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

有没有人对此有任何建议?提前致谢!


编辑

[WPF] ObservableCollection and ListBoxItem DataTemplate generation problem

上面的链接与 mdm20 的建议非常相似,但我仍然卡住了。每次我尝试获取 ActualHeight 时,它都会返回 0。此外,Silverlight 3 中的 ItemContainerGenerator 会为容器返回 null,除非我将调用包装在 Dispatcher.BeginInvoke 操作中。

【问题讨论】:

  • 尝试使用 this.UpdateLayout()

标签: wpf silverlight panel itemscontrol


【解决方案1】:

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

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

您实际上需要在模板中指定一个高度才能使其正常工作。我想你只关心高度,所以我把宽度留了0。

获得模板高度后,您可能需要设置某种地图来跟踪哪些对象在哪个页面上。每次尺寸改变或物品来源改变时都必须重新创建。

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

这就是我会尝试这样做的方式..如果这有任何意义的话:)

【讨论】:

    【解决方案2】:

    在构建UIElement 之前,确实不可能直接测量它,但是您可以通过预先知道它们将占用多少空间的方式来构建列表元素。例如,您可以使用Grid 对每个元素进行布局,为标题使用已知高度的行(例如headerHeight),为每个子项使用已知高度的行(例如subitemHeight) .然后,您可以通过论坛headerHeight + numSubitems * subitemHeight 计算每个元素的高度。此外,如果您知道项目的数量会相当少,比如少于 1000 个,那么您可能只想提前创建它们,因为此时性能损失可能是可以容忍的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多