2010-01-27 16 views
12
  1. ¿Cómo puedo saber si mi lista se está virtualizando o no?
  2. ¿Cómo virtualizo este fragmento?WPF: cuadros de lista y virtualización

    <ScrollViewer Grid.Column="1" Name="LogScroller"> 
        <r:NoInheritanceContentControl> 
         <ListBox Background="Black" ItemsSource="{Binding Path=ActiveLog}" > 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Grid Background="Black"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="200"></ColumnDefinition> 
              <ColumnDefinition Width="*"></ColumnDefinition> 
             </Grid.ColumnDefinitions> 
             <Grid.RowDefinitions> 
              <RowDefinition></RowDefinition> 
              <RowDefinition></RowDefinition> 
             </Grid.RowDefinitions> 
             <TextBlock Grid.Column="0" Grid.Row="0" Foreground="White"> 
             <TextBlock >Date:</TextBlock> 
             <TextBlock Text="{Binding Path=LogDate}"/> 
            </TextBlock> 
             <TextBlock Grid.Column="1" Grid.Row="0" Foreground="White"> 
             <TextBlock >Severity:</TextBlock> 
             <TextBlock Text="{Binding Path=Severity}"/> 
            </TextBlock> 
             <TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Foreground="LightGray" Text="{Binding Path=Message}"></TextBlock> 
            </Grid> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
          <ListBox.Template> 
           <ControlTemplate> 
            <StackPanel Background="Black" IsItemsHost="True" > 
            </StackPanel> 
           </ControlTemplate> 
          </ListBox.Template> 
         </ListBox> 
        </r:NoInheritanceContentControl> 
    </ScrollViewer> 
    

Respuesta

13

Su muestra de código no se virtualiza porque está forzando el uso de un StackPanel. Tienes que usar un VirtualizingStackPanel.

+0

El enlace [bea.stollnitz blog] (http://bea.stollnitz.com/blog /), no parece ser relevante para la pregunta por más tiempo. Sospecho que la información se ha movido. –

1

According to the MSDN forums, All databound listboxes are virtualized

Puede comprobar lo que está pasando en su aplicación utilizando Snoop - ratón por encima de su cuadro de lista (o uno de los elementos) y mirar las propiedades. Uno de ellos es VirtualizingStackPanel.IsVirtualizing - se comprobará si la lista está virtualizada, y si no está marcada

+0

¿Tiene usted nay otros programas para probar? Desafortunadamente, Snoop no funciona con .NET 4. –

+0

Además, leí en otro lugar que los ListBox solo virtualizan de forma predeterminada. Una vez que comienzas a sobreescribir cosas, puedes perder el efecto. –

+3

@jonathan allen (¿o lo escribes @ jonathan-allen por el espacio?) Snoop ahora es compatible con .NET 4.0. (Sí, sé que esto es muy antiguo, pero bueno ... ¡algunas personas pueden no saberlo!) – MarqueIV

2

Para saber si está virtualizado, simplemente puede agregar 10K entradas ficticias a la colección y ver qué tan rápido ocurre la carga, así como qué tan rápido funciona el desplazamiento vertical, lo que claramente marcará una gran diferencia. Supongo que necesita cambiar su StackPanel en la plantilla de control al VirtualizingStackPanel.

+0

Definitivamente intentaré eso, pero sin una respuesta al # 1 no sabré si funciona. –

+0

Sabrá si no es así. –

7
  1. Si quiere saber con certeza. Descargue Snoop tiene una vista en 3D que puede usar para ver cada elemento que se representa. (pantalla activada y desactivada) Si su cuadro de lista no está virtualizado, verá todos los elementos de la lista que marchan fuera de la página en una hermosa vista en 3D.

Es una herramienta esencial para el desarrollador WPF ya que tiene un par de otras características muy útiles, así

  1. deshacerse de la plantilla de cuadro de lista que utiliza un panel de pila. Si todo lo que hace es oscurecer el fondo, simplemente configure el fondo como negro.
+0

Si no incluyo la plantilla, la rueda de desplazamiento del mouse no funciona. Lo cambié a VirtualizingStackPanel. –

+0

Desearía poder usar Snoop, pero no puedo hacer que funcione contra .NET 4. –

+0

throw a NotFairNoSnoopImplementedException()): –

Cuestiones relacionadas