1

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

标题 1

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

标题 2

  • 子项 1
  • 子项 2

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

I made some progress working with MeasureOverride and ArrangeOverride but I keep running into dead-ends. It's really frustrating because this is something that is computationally trivial but a nightmare to accomplish in WPF/Silverlight. If you have ever worked with reporting packages, the concept is very similar to this.

I keep coming back to the fact that I can't determine the height until after I have added the children to the control (using Dispatcher.BeginInvoke).

Does anyone have any suggestions for accomplishing this? Thanks in advance!


Edit

[WPF] ObservableCollection and ListBoxItem DataTemplate generation problem

This above link is very similar to what mdm20 has suggested, but I am still stuck. Everytime I try to get the ActualHeight, it returns 0. Additionally, the ItemContainerGenerator in Silverlight 3 returns null for the container unless I wrap the call in a Dispatcher.BeginInvoke operation.

4

2 回答 2

0

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

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

您实际上需要在模板中指定一个高度才能使其正常工作。我认为您只关心高度,所以我将宽度设为 0。

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

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

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

于 2009-05-13T13:56:15.600 回答
0

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

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

于 2009-05-13T14:08:45.643 回答