如何有效地实现ScrollViewer背景网格?

| 我目前正在开发一个应用程序,该应用程序根据时间轴上的时间戳显示数据项。以下屏幕截图为您提供了一个想法: (来源:antiserum.ch) 时间线每十毫秒包含索引线。它使用Canvas在正确的位置呈现数据项,并使用StackPanel显示索引线。 您在场景中看到的正是我想要实现的目标。但是,为了显示索引线,我目前正在填充一个TimeSpan对象的列表,每个对象增加10ms,以获取完整的数据集持续时间。该列表将显示在ItemsItem控件中,并带有一个Items数据模板,该模板绘制一条白线,一个黑框和文本。 可以想象,从性能的角度来看,这可能是最糟糕的方法,因为ItemsControl仅在十秒钟的数据中就已经包含1000个元素。 所以我的问题是,如何有效地绘制索引标记? 我已经考虑过使用VirtualizingStackPanel显示TimeSpan项。这不是一个选项,因为ScrollViewer不直接包含索引列表。在这种情况下,虚拟化似乎不起作用。 为了澄清起见,这是我的xaml代码的片段(我删除了模板和样式代码):
<ScrollViewer x:Name=\"timelineScroller\">
  <Grid>
    <ItemsControl x:Name=\"IndexMarkers\" ItemsSource=\"{Binding IndexMarkers}\" />
    <ItemsControl x:Name=\"TimelineList\" ItemsSource=\"{Binding Lines}\" />
  </Grid>
</ScrollViewer>
一种可能的解决方案是在渲染时将ScrollViewer子类化并在ScrollViewer的背景上绘制索引线和文本。这应该是有效的,因为它只能渲染实际可见的线。但是,我没有找到有关如何实现这种渲染自定义的信息。 任何想法表示赞赏。 问候, 丹尼尔     
已邀请:
我最终采用的方法似乎运行良好,并且没有任何虚拟化: 索引标记的列表是恒定的,但是根据当前时间以标记宽度为模,得到RenderTransform-ed。这使ScrollViewer背景随鼠标移动,并突然跳回到原始位置(这种情况仅在通过模运算将值“环绕”时发生)。 剩下要做的就是在那一刻更新标记的标签。这种方法效果很好,用户看不到标签的跳跃。     
听起来您可能需要显式实现虚拟化。 请记住,您可能希望合并标记(如在可能的情况下重用相同的元素,因为创建/销毁标记可能会在尝试清理所有这些对象时导致严重的垃圾收集器崩溃。 如果使用了Canvas,则基本上可以在代码中修改Canvas的子代以显示所需的元素(指定其坐标)。     

要回复问题请先登录注册