为什么我的listboxitems没有崩溃?

如果我单击列表中间的项目,我希望除了1个元素之外的所有元素都会折叠。 实际输出是剩下很多项目。 为什么? 这是整个计划。

using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; namespace WpfApplication2 { public partial class MainWindow : Window { public class obj { } public MainWindow() { InitializeComponent(); List objList = new List(); for (int i = 0; i < 30; i++) objList.Add(new obj()); lb.ItemsSource = objList; } private void lb_SelectionChanged(object sender, SelectionChangedEventArgs e) { ListBox lb = sender as ListBox; for (int i = 0; i < lb.Items.Count; i++) { ListBoxItem tmp = (ListBoxItem)(lb.ItemContainerGenerator.ContainerFromItem(lb.Items[i])); if (tmp != null) { if (tmp.IsSelected) tmp.Visibility = System.Windows.Visibility.Visible; else tmp.Visibility = System.Windows.Visibility.Collapsed; } } } } }              

我相信它是因为你使用了ItemContainerGenerator.ContainerFromItem

ListBox默认使用VirtualizingStackPanel 。 因此,尚未创建加载窗口时不在屏幕上的项目。 将它们设置为Collapsed一旦它们被带回屏幕就无效。

您可以通过更改Window的初始高度来稍微玩一下。 如果将其设置为550左右,则按预期工作。 如果将其设置为150左右,则仍会看到很多元素。

如果你不想拥有那么多元素,你可以做的一件事就是改变ItemsPanel

您可能需要禁用虚拟化 。 在需要之前,默认情况下不会创建ListBoxItems。 当您折叠可见的ListBoxItems时,您可以腾出更多空间,这将在您的代码运行后创建。

将其添加到ListBox:

 VirtualizingStackPanel.IsVirtualizing="False" 

或者您可以使用样式来折叠项目,如下所示: