2009-04-29 6 views
2

Hy.WPF/C# Textwrapping dans un scrollviewer rend le redimensionnement de la fenêtre laggy

J'ai un ListBox avec un scrollviewer dedans. Chaque élément (40 ++ items) de la listbox contient un bloc de texte et une petite image. Lorsque je redimensionne la fenêtre, le redimensionnement est très décalé. Si je mets la visibilité du bloc de texte des éléments à "réduit", le redimensionnement est correct. Ma première approche consistait à définir la visibilité de chaque élément non affiché dans le scrollviewer sur «replié», mais je n'ai pas pu trouver d'indicateur lorsqu'un élément est visible par l'utilisateur.

Est-ce que quelqu'un a une idée pour rendre le processus de redimensionnement moins laggy, peut-être un autre contrôle au lieu du bloc de texte? Merci pour votre aide.

+0

Postez votre code XAML ou des repro ductions simplifiées. –

Répondre

0

La meilleure façon d'améliorer les performances de redimensionnement est , pour utiliser un VirtualizingStackPanel dans votre ScrollContentPresenter. Vous pouvez remplacer cela dans le modèle de données de par exemple votre ListBox, ou en général, vous ItemsPanel.

Il ne rend pas les éléments, qui ne sont pas visibles, par rapport à un StackPanel normal, qui rend tous les éléments tout le temps, qu'ils soient visibles ou non par l'utilisateur.

Fonctionne très bien pour moi.

0

Voici indiquant si l'élément à l'offset donné est visible ou non:

public bool IsItemVisible(ListBox listBox, int index) 
{ 
    if (listBox.Items.Count != 0) 
    { 
     VirtualizingStackPanel vsp = (VirtualizingStackPanel)VisualTreeHelper.GetParent(listBox.ItemContainerGenerator.ContainerFromIndex(0)); 
     int FirstVisibleItem = (int)vsp.VerticalOffset, VisibleItemCount = (int)vsp.ViewportHeight; 
     return index >= FirstVisibleItem && index <= FirstVisibleItem + VisibleItemCount; 
    } 

    return false; 
} 

Vous pouvez l'utiliser comme ceci:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = listbox1.Items.Count - 1; i >= 0; i--) 
     if (!IsItemVisible(listbox1, i)) 
      ((ListBoxItem)listbox1.Items[i]).Visibility = Visibility.Collapsed; 
} 
+0

Je ne sais pas si cela fonctionne pour moi, car j'aurais besoin de cette vérification sur chaque activité de défilement et sur chaque événement de taille unique changé (par événement de déplacement de la souris, et c'est assez souvent). Je pense que cela ralentirait la performance au moins en laissant tous les éléments visibles et non effondrés. – dalind

+0

Pourquoi ne pas filtrer le contenu de votre listbox selon certains critères? (par exemple par la première lettre de chaque article) – CSharper

+0

Je le filtre, mais à mon avis cela n'a rien à voir avec la visibilité. La visibilité d'un élément peut changer à chaque mouvement de la piste du scrollviewer, donc le filtrage n'aurait aucun sens, je pense. Ou ai-je mal compris quelque chose? – dalind

Questions connexes