4

TreeView 没有ScrollIntoView()方法
唯一的方法是调用TreeVewItem.BringIntoView()相应的数据项容器。
但是如果 node 不可见并且还没有生成容器,ItemsControl.ItemContainerGenerator.ContainerFromItem()将返回null.

所以应该有一些方法来强制 ItemContainerGenerator 为项目创建容器。

合理的问题是:如何扩展节点并保持不可见?!

简单的!IsExpanded绑定到 VM 的属性。UI 虚拟化按预期工作:
TreeViewItem.Expanded 的事件处理程序仅在手动滚动到项目时被调用。

4

1 回答 1

1

我不能保证这个问题足够相似以提供帮助,但我想因为我找不到自己的问题的好答案,所以我会在这里发布,因为这是相似的,我想出了如何解决我的问题。

我正在使用Canvas控件,并且在该画布上放置了复杂的 UI 元素,并将ItemsControl控件作为其 XAML UI 定义的一部分。ItemsControl已在其ItemTemplates中定义了DataTemplates集。

因此,我的对象的某些方面只有在更新可视化树后才会完全生成。这不是在处理画布时拖放和使用项目的问题,因为ItemContainerGenerator在我需要时已经生成了项目。但是,在可视化树绘制自身之前,在 Canvas 加载时尝试从数据库重新生成项目时,这是一个问题。

我发现解决这个问题的唯一真正方法是,一旦触发了画布的 LayoutUpdated 事件,就开始在画布上放置“辅助对象”(与ItemContainerGenerators制作的对象相关联的对象)。

public class DesignerCanvas : Canvas
{
  public void LoadCanvasFromDB()
  {
    ...
    [loading items from the database, part one]
    LayoutUpdated += DesignerCanvas_LayoutUpdated;
  }

  void DesignerCanvas_LayoutUpdated(object sender, EventArgs e)
  {
    LayoutUpdated -= DesignerCanvas_LayoutUpdated;
    [loading items from the database which tie to UI elements from part one]
于 2013-04-06T20:41:18.340 回答