如何强制ItemContainerGenerator为项目生成容器,或者如何在启用UI虚拟化时将TreeView滚动到展



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

因此,应该有一些方法来强制ItemContainerGenerator为该项创建容器

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

轻松!IsExpanded绑定到VM的属性。并且UI虚拟化按预期工作:
TreeViewItem.Expanded的事件hanlder仅在手动滚动到该项时调用。

我不能保证这个问题足够相似,但我想,由于我找不到一个好的答案来解决我自己的问题,我会在这里发布,因为这是类似的,我想好了如何解决我的问题。

我使用的是一个Canvas控件,该控件上有复杂的UI元素,并且ItemsControl控制器是其XAML UI定义的一部分。ItemsControl的已在其ItemTemplates中定义了数据模板集。

因此,只有在更新了Visual Tree之后,我的对象的某些方面才会完全生成。这不是在画布上拖放和处理项目的问题,因为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]

最新更新