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

Wpf 如何构建具有重复标题的分页项控件或面板?,wpf,silverlight,panel,itemscontrol,Wpf,Silverlight,Panel,Itemscontrol,我正在尝试构建一个面板或ItemsControl,它将以以下形式显示项目: 标题1 分项目1 分项目2 分项目3 标题2 分项目1 分项目2 这很容易,但这里的问题是,我需要能够以分页方式拆分项目。根据控件的高度,任何不合适的内容都将出现在下一页(以此类推)。如果子项之间发生拆分,我也需要在下一页上重新显示相应的标题 我在MeasureOverride和ArrangeOverride的工作中取得了一些进展,但我一直走到死胡同。这确实令人沮丧,因为在WPF/Silverlight中,这在计

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

标题1

  • 分项目1
  • 分项目2
  • 分项目3
标题2

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

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

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

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


编辑


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

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

    Size maxSize = new Size(0, 30);
    UIElement templateRoot = template.LoadContent() as UIElement;
    templateRoot.Measure(maxSize);
    Size size = templateRoot.DesiredSize;
但是,您需要在模板中实际指定一个高度,才能使其正常工作。我想你只关心高度,所以我留下了宽度0

获得模板高度后,可能需要设置某种地图来跟踪哪个页面上的对象。每次大小更改或项目源更改时,都必须重新创建此文件

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


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

在构建一个
UIElement
之前,确实不可能直接测量它,但是您可以以这样一种方式构建列表元素,即您可以提前知道它们将占用多少空间。例如,您可以使用
网格
来布局每个元素,标题有一行已知高度(例如
标题高度
),每个子项有一行已知高度(例如
子项高度
)。然后,您可以通过forumula
headerHeight
+
numSubitems
*
子项高度来计算每个元素的高度。此外,如果您知道项目的数量非常少,比如说少于1000个,那么您可能只想继续并提前创建它们,因为此时性能损失可能是可以忍受的


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

尝试使用这个。UpdateLayout()