Почему мои списки не разрушаются? - PullRequest
6 голосов
/ 25 мая 2011

Если я щелкну элемент в середине списка, я ожидаю, что все элементы, кроме 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>

Ответы [ 2 ]

7 голосов
/ 25 мая 2011

Я считаю, что это из-за вашего использования ItemContainerGenerator.ContainerFromItem.

ListBox использует VirtualizingStackPanel по умолчанию.Таким образом, элементы, которые не отображаются на экране при загрузке окна, еще не созданы.Установка их на Collapsed не имеет никакого эффекта, когда они возвращаются на экран.

Вы можете немного поиграть с этим, изменив начальную высоту Window.Если вы установите его на 550 или около того, он работает как положено.Если вы установите его на 150 или около того, у вас будет МНОГО элементов, которые все еще видны.

Одна вещь, которую вы можете сделать, чтобы изменить это, если у вас не будет такого количества элементов, это просто изменить1012 *.

4 голосов
/ 25 мая 2011

Возможно, вам нужно отключить виртуализацию .Элементы ListBoxItems не будут создаваться по умолчанию, пока они не понадобятся.Когда вы сворачиваете видимые элементы ListBoxItems, вы освобождаете место для большего, который будет создан после запуска вашего кода.

Добавьте это в свой ListBox:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...