1

每个人都说 ListBox 的默认 ItemsPanel 是 VirtualizingStackPanel。我创建了一个 ListBox 派生类(称为 MyListBox),它默认为 StackPanel。

我的意思是我必须强制虚拟化,例如这样:

const string itemsPanelTemplateString = @"
<ItemsPanelTemplate
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
<VirtualizingStackPanel/>
</ItemsPanelTemplate>";

MyListBox {
    this.ItemsPanel = (ItemsPanelTemplate)
        System.Windows.Markup.XamlReader.Load(itemsPanelTemplateString);
}

我可以在这里重印我的课程,但这不是重点。我想知道一般答案。

该类不会更改预定义的 ListBox 样式,但它使用自己的 ListBoxItem 派生类。

我很确定使用虚拟化有一些条件,因为我的同事说他过去看到过相应的 ListBox 代码。不幸的是,现在我们无法访问 MS dll 的调试版本。

4

4 回答 4

1

默认情况下,从 ListBox 派生的 ListBox 和控件将 VirtualizedStackPanel 作为 ItemsPanel,除非用户代码明确更改它。

但是,如果您的自定义 ListBox 恰好直接从 ItemsControl 派生(而不是实际上从 ListBox 派生),那么您将 StackPanel 作为默认 ItemsPanel。

您的代码中可能是这种情况吗?如果没有,请分享您的控制代码。

于 2011-04-08T22:22:42.223 回答
1

解决了。这是我的错误:

在覆盖 ListBox.OnApplyTemplate() 时(为了时间测量),我忘记调用 base.OnApplyTemplate()。显然项目面板的选择是在那里完成的。

危险的错误,因为一切似乎都有效。

感谢所有试图提供帮助的人。

于 2011-04-11T13:25:51.233 回答
0

ListBox 的默认样式不分配 ItemsPanel 模板。

根据我在反射器中看到的内部代码,如果未提供模板,OnApplyTemplate则会将 a 分配VirtualizingStackPanel给内部。ItemsHostItemsPanel

毕竟,也许包括你的类代码可能是一个好主意。

于 2011-04-08T16:56:23.787 回答
0

您可以在http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performance找到有关提高列表框性能的好建议。 aspx

这也是一个很好的替代方法,记录在http://blogs.msdn.com/b/delay/archive/2010/09/08/never-do-today-what-you-can-put-off-till-tomorrow-deferredloadlistbox -and-stackpanel-help-windows-phone-7-lists-scroll-smoothly-and-consistently.aspx

另一件需要注意的事情(显然)是,如果您绑定到的集合实现了,您也只能获得虚拟化IList

于 2011-04-08T18:36:17.687 回答