微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的listboxitems不会崩溃?

如何解决为什么我的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<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
。因此,尚未创建加载窗口时屏幕上未显示的项目。将它们重新显示在屏幕上时,将它们设置为“ 4”无效。 您可以通过更改
Window
的初始高度来解决这个问题。如果将其设置为550左右,它将按预期工作。如果将其设置为150左右,则仍然有很多元素可见。 如果您不打算拥有太多元素,可以做的一件事就是更改
ItemsPanel
。     ,您可能需要禁用虚拟化。除非需要,否则默认情况下不会创建ListBoxItems。当您折叠可见的ListBoxItems时,您会为更多的空间腾出空间,这些空间将在运行代码后创建。 将此添加到您的列表框:
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>
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。