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]