【问题标题】:WPF Listbox Virtualization - How to Bring Item Into ViewWPF 列表框虚拟化 - 如何将项目带入视图
【发布时间】:2018-02-01 18:37:49
【问题描述】:

我有一个列表框,我必须在其中启用虚拟化。然后,我有一张地图,上面绘制了需要让用户单击它们的功能的项目。当他们单击一个项目时,我需要将该项目显示在列表框中。

问题在于虚拟化。当我尝试抓取容器时,它返回 null,这是有道理的,但是正确的做法是什么?我已经尝试了一些东西,例如UpdateLayout(),但我还没有找到答案。有什么想法吗?

var container = lstItems.ItemContainerGenerator.ContainerFromItem(clickedItem);
if (container != null)
{
     var exp = container.Descendants().OfType<Expander>().FirstOrDefault();
     if (exp != null)
     {
          exp.IsExpanded = true;
          exp.BringIntoView();
     }
}

【问题讨论】:

    标签: c# wpf listbox virtualization


    【解决方案1】:

    ListBox 为您提供了一种方法来做到这一点:

    lstItems.ScrollIntoView(clickedItem);
    

    如果您在已经显示的代码上方插入该行,那么container 应该会给您一个实际的ListBoxItem

    但是,如果项目不在视野范围内,则可能尚未应用模板。您可以通过在搜索 Expander 之前调用 container.UpdateLayout() 来解决此问题。

    不过,您仍然需要调用 exp.BringIntoView(),因为扩展器可能会在扩展后变得更大,而对 ScrollIntoView 的初始调用可能无法将其带到视口中的足够远。或者,您可以再次拨打ScrollIntoView

    【讨论】:

    • exp 在项目不在视图中时返回 null。当我再次单击它时(在该项目处于视图中之后),exp 不再为空。 UpdateLayout() 是解决此问题的正确方法吗?
    • 并通过询问它是否是“正确的方式”,我的意思是,它是正确的方式吗?它确实解决了这个问题,但是如果有更高效的方法来完成它,我不想使用它。
    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多