Problematornillos de virtualización ListBox WPF artículos
Necesitamos mostrar de manera eficiente un gran número (> 1000) de los objetos en un control ListBox WPF visualizado. Estamos confiando en la virtualización WPF ListBox (a través de VirtualizingStackPanel) para mostrar estos elementos de manera eficiente.
Error: El control WPF ListBox no muestra los elementos correctamente al usar la virtualización.
cómo reproducir
Hemos destilada el problema a la xaml independiente se muestra a continuación.
Copie y pegue el xaml en XAMLPad.
Inicialmente, no hay ningún elemento seleccionado en el ListBox, por lo que, como se esperaba, todos los elementos tienen el mismo tamaño y ocupan por completo el espacio disponible.
Ahora, haga clic en el primer elemento. Como era de esperar, debido a nuestro DataTemplate, el elemento seleccionado se expandirá para mostrar información adicional.
Como era de esperar, esto hace que aparezca la barra de desplazamiento horizontal, ya que el elemento seleccionado ahora es más ancho que el espacio disponible.
Ahora use el mouse para hacer clic y arrastrar la barra de desplazamiento horizontal hacia la derecha.
Error: los elementos visibles no seleccionados ya no se extienden para ocupar el espacio disponible. Todos los elementos visibles deben tener el mismo ancho.
¿Es este un error conocido? ¿Hay alguna forma de solucionar esto, ya sea a través de XAML o mediante programación?
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Page.Resources>
<DataTemplate x:Key="MyGroupItemTemplate">
<Border Background="White"
TextElement.Foreground="Black"
BorderThickness="1"
BorderBrush="Black"
CornerRadius="10,10,10,10"
Cursor="Hand"
Padding="5,5,5,5"
Margin="2"
>
<StackPanel>
<TextBlock Text="{Binding Path=Text, FallbackValue=[Content]}" />
<TextBlock x:Name="_details" Visibility="Collapsed" Margin="0,10,0,10" Text="[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]" />
</StackPanel>
</Border>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}"
Value="True">
<Setter Property="TextElement.FontWeight"
TargetName="_details"
Value="Bold"/>
<Setter Property="Visibility"
TargetName="_details"
Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Page.Resources>
<DockPanel x:Name="LayoutRoot">
<Slider x:Name="_slider"
DockPanel.Dock="Bottom"
Value="{Binding FontSize, ElementName=_list, Mode=TwoWay}"
Maximum="100"
ToolTip="Font Size"
AutoToolTipPlacement="BottomRight"/>
<!--
I want the items in this ListBox to completly fill the available space.
Therefore, I set HorizontalContentAlignment="Stretch".
By default, the WPF ListBox control uses a VirtualizingStackPanel.
This makes it possible to view large numbers of items efficiently.
You can turn on/off this feature by setting the ScrollViewer.CanContentScroll to "True"/"False".
Bug: when virtualization is enabled (ScrollViewer.CanContentScroll="True"), the unselected
ListBox items will no longer stretch to fill the available horizontal space.
The only workaround is to disable virtualization (ScrollViewer.CanContentScroll="False").
-->
<ListBox x:Name="_list"
ScrollViewer.CanContentScroll="True"
Background="Gray"
Foreground="White"
IsSynchronizedWithCurrentItem="True"
TextElement.FontSize="28"
HorizontalContentAlignment="Stretch"
ItemTemplate="{DynamicResource MyGroupItemTemplate}">
<TextBlock Text="[1] This is item 1." />
<TextBlock Text="[2] This is item 2." />
<TextBlock Text="[3] This is item 3." />
<TextBlock Text="[4] This is item 4." />
<TextBlock Text="[5] This is item 5." />
<TextBlock Text="[6] This is item 6." />
<TextBlock Text="[7] This is item 7." />
<TextBlock Text="[8] This is item 8." />
<TextBlock Text="[9] This is item 9." />
<TextBlock Text="[10] This is item 10." />
</ListBox>
</DockPanel>
</Page>
¡Gracias Will! Consulte "Responder" a continuación para obtener más detalles. –