为什么不';我的列表项目没有崩溃

本文关键字:项目 崩溃 列表 我的 为什么不 | 更新日期: 2023-09-27 17:57:44

如果我点击列表中间的一个项目,我希望除了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<obj> objList = new List<obj>();
            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;
                }
            }
        }
    }
}

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        >
    <Grid>
        <ListBox Name="lb" SelectionChanged="lb_SelectionChanged" IsSynchronizedWithCurrentItem="True" >
            <ListBox.ItemTemplate >
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Name="tb1" Text="whatever"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

为什么不';我的列表项目没有崩溃

我相信这是因为您使用了ItemContainerGenerator.ContainerFromItem

默认情况下,ListBox使用VirtualizingStackPanel。因此,加载窗口时不在屏幕上的项目尚未创建。一旦它们重新出现在屏幕上,将其设置为Collapsed就没有任何效果。

您可以通过更改Window的初始高度来稍微处理一下。如果您将其设置为550左右,它将按预期工作。如果你把它设置为150左右,你会有很多元素仍然可见。

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

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

将此添加到您的列表框:

VirtualizingStackPanel.IsVirtualizing="False"

或者你可以使用样式来折叠项目,比如:

<ListBox.ItemContainerStyle>
     <Style TargetType="ListBoxItem">
         <Style.Triggers>
             <Trigger Property="IsSelected" Value="False">
                 <Setter Property="Visibility" Value="Collapsed" />
             </Trigger >
         </Style.Triggers>
     </Style>
</ListBox.ItemContainerStyle>