Condividi tramite


Procedura: migliorare le prestazioni di un controllo TreeView

Aggiornamento: Luglio 2008

Se un controllo TreeView contiene molti elementi, il tempo necessario perché venga caricato può comportare un notevole ritardo nell'interfaccia utente. Per migliorare i tempi di caricamento, impostare la proprietà associata VirtualizingStackPanel.IsVirtualizing su true. Sono inoltre possibili lentezze dell'interfaccia utente quando un utente scorre il controllo TreeView agendo sulla rotellina del mouse o trascinando il cursore di una barra di scorrimento. È possibile migliorare le prestazioni di TreeView quando l'utente scorre la visualizzazione impostando la proprietà associata VirtualizingStackPanelVirtualizationMode() su Recycling.

Esempio

Descrizione

Nell'esempio seguente viene creato un controllo TreeView in cui la proprietà VirtualizingStackPanel.IsVirtualizing viene impostata su true e la proprietà VirtualizingStackPanelVirtualizationMode() su Recycling per ottimizzare le prestazioni.

Code

<StackPanel>
  <StackPanel.Resources>
    <src:TreeViewData x:Key="dataItems"/>


    <HierarchicalDataTemplate DataType="{x:Type src:ItemsForTreeView}"
                              ItemsSource="{Binding Path=SecondLevelItems}">

      <!--Display the TopLevelName property in the first level.-->
      <TextBlock Text="{Binding Path=TopLevelName}"/>
      
      <!--Display each string in the SecondLevelItems property in
          the second level.-->
      <HierarchicalDataTemplate.ItemTemplate>
          <DataTemplate>
              <TextBlock Text="{Binding}"/>
          </DataTemplate>
      </HierarchicalDataTemplate.ItemTemplate>
      
      <!--Set the foreground of the items in the second level
          to Navy.-->
      <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
          <Setter Property="Foreground" Value="Navy"/>
        </Style>
      </HierarchicalDataTemplate.ItemContainerStyle>  
    </HierarchicalDataTemplate>
  </StackPanel.Resources>

  <TreeView Height="200" ItemsSource="{Binding Source={StaticResource dataItems}}"
            VirtualizingStackPanel.IsVirtualizing="True"
            VirtualizingStackPanel.VirtualizationMode="Recycling">
    <TreeView.ItemContainerStyle>
      
      <!--Expand each TreeViewItem in the first level and 
          set its foreground to Green.-->
      <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="True"/>
        <Setter Property="Foreground" Value="Green"/>
      </Style>
    </TreeView.ItemContainerStyle>
  </TreeView>
</StackPanel>

Nell'esempio seguente vengono illustrati i dati utilizzati nell'esempio precedente.

public class TreeViewData : ObservableCollection<ItemsForTreeView>
{

    public TreeViewData()
    {
        for (int i = 0; i < 100; ++i)
        {
            ItemsForTreeView item = new ItemsForTreeView();
            item.TopLevelName = "item " + i.ToString();
            Add(item);
        }
    }
}


public class ItemsForTreeView
{
    public string TopLevelName { get; set; }
    private ObservableCollection<string> level2Items;

    public ObservableCollection<string> SecondLevelItems
    {
        get 
        {
            if (level2Items == null)
            {
                level2Items = new ObservableCollection<string>();
            }
            return level2Items;
        }
    }

    public ItemsForTreeView()
    {
        for (int i = 0; i < 10; ++i)
        {
            SecondLevelItems.Add("Second Level " + i.ToString());
        }
    }
}

Vedere anche

Concetti

Ottimizzazione delle prestazioni: controlli

Cronologia delle modifiche

Date

History

Motivo

Luglio 2008

Argomento aggiunto per mostrare le nuove funzionalità di virtualizzazione dell'interfaccia utente e di riciclo del contenitore.

Modifica di funzionalità in SP1.