VirtualizingStackPanel неправильно обрабатывает свернутые элементы - PullRequest
3 голосов
/ 08 февраля 2012

У меня есть ListView в wpf, который используется для отображения списка полей;в зависимости от значения свойства некоторые поля могут быть свернуты во время выполнения.Работает нормально, за исключением того, что ListVIew не сокращает пространство, зарезервированное для ListViewItem, которое было свернуто во время выполнения.

enter image description here

Я могу видеть дополнительные ListViewItems в Snoop (видимость какСвернуто), ListView тоже смещает элементы вверх, но не регулирует его высоту, чтобы удалить пустое пространство!

Я могу с уверенностью сказать, что это происходит из-за VirtualizedStackPanel, поскольку изменение ItemsPanel на StackPanel решаетвопрос.Вот соответствующий ListView XAML:

<ListView
    x:Class="Wizards.FieldBinderModelListView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Margin="0"
    VerticalAlignment="Top"
    HorizontalContentAlignment="Stretch"
    VerticalContentAlignment="Top"
    Background="White"
    BorderThickness="0"
    Grid.IsSharedSizeScope="True"
    KeyboardNavigation.DirectionalNavigation="Continue"
    Padding="1"
    ScrollViewer.HorizontalScrollBarVisibility="Hidden"
    ScrollViewer.VerticalScrollBarVisibility="Hidden"
    SelectionChanged="ListViewSelectionChanged"
    SelectionMode="Single">
    <ListView.ItemsPanel>
       <ItemsPanelTemplate>
        <!--Works fine with StackPanel but not with VirtualizingStackPanel
          Explicitly added this PanelTemplate to show that it works with            
          StackPanel;ListView uses VirtualizingStackPanel as default panel 
          and causes same problem-->              
        <!--<StackPanel Orientation="Vertical" VerticalAlignment="Top"/>-->
          <VirtualizingStackPanel Orientation="Vertical" 
               VerticalAlignment="Top"/>
       </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <ListView.ItemContainerStyle>
      <Style TargetType="{x:Type ListViewItem}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="Black" />
            </Trigger>
            <DataTrigger Binding="{Binding Status}"
                         Value="{x:Static local:Status.NotExisting}">
                <!--Hide the fields which are in NotExisting state; 
                  Need a trigger here as Status can be different -->
                <Setter Property="Visibility" Value="Collapsed" />
            </DataTrigger>
        </Style.Triggers>
      </Style>
  </ListView.ItemContainerStyle>
  <ListView.ItemTemplate>
    <DataTemplate DataType="{x:Type View:FieldViewModel}">
       <local:FieldEditor
          Margin="0,2,0,0"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Top"
          HorizontalContentAlignment="Stretch"
          VerticalContentAlignment="Top"
          Padding="0">
          <!--<local:FieldEditor.Style>
              <Style TargetType="{x:Type local:FieldEditor}">
                <Style.Triggers>
                  <DataTrigger
                    Binding="{Binding Status}"
                    Value="{x:Static local:Status.NotExisting}">
                      <Setter Property="Visibility" Value="Collapsed" />
                  </DataTrigger>
                </Style.Triggers>
              </Style>
            </local:FieldEditor.Style>-->
        </local:FieldEditor>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

Это ошибка в VirtualizingStackPanel?Кто-нибудь еще сталкивался с подобной проблемой?Есть обходные пути?


Обновление:

Сообщил об этой ошибке в MS при подключении - https://connect.microsoft.com/VisualStudio/feedback/details/734113/virtualizingstackpanel-not-handling-collapsed-items-correctly

Ответы [ 2 ]

6 голосов
/ 11 февраля 2012

Мне удалось воспроизвести вашу проблему. Это, конечно, похоже на ошибку в VirtualizingStackPanel. Обходной путь - установить высоту скрытых элементов на ноль, а не сворачивать их:

<DataTrigger Binding="{Binding Status}" Value="False">
    <Setter Property="Height" Value="0" />
    <Setter Property="IsEnabled" Value="False"/>
    <!--<Setter Property="Visibility" Value="Collapsed" />-->
</DataTrigger>
2 голосов
/ 20 декабря 2018

Для тех, кто ищет способ продолжить полагаться на Visibility, но также убрать лишний интервал, я исправил его, удалив Padding в стиле для ListBoxItem:

<ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
        <Setter Property="Padding" Value="0"/>
    </Style>
</ListBox.ItemContainerStyle>

Похоже, что ListBoxItem значение по умолчанию равно 3.

...