2009-04-29 19 views
2

Hy.WPF/C# Textumbruch in einem Scrollviewer macht Fenstergrößenänderung verzögert

Ich habe eine ListBox mit einem scrollviewer drin. Jedes Element (40 ++ Elemente) der Listbox enthält einen Textblock und ein kleines Bild. Wenn ich die Größe des Fensters ändere, ist die Größenänderung sehr verzögert. Wenn ich die Textblock-Sichtbarkeit der Elemente auf "Collapsed" setze, ist die Größenanpassung in Ordnung. Mein erster Ansatz bestand darin, die Sichtbarkeit jedes im Scrollviewer nicht angezeigten Elements auf "minimiert" zu setzen, aber ich konnte keinen Indikator finden, wenn ein Element für den Benutzer sichtbar ist.

Hat jemand eine Idee, den Größenänderungsprozess weniger lückig zu machen, vielleicht eine andere Kontrolle anstelle des Textblocks? Vielen Dank für Ihre Hilfe.

+0

Poste deinen XAML oder einen vereinfachten Repro pls. –

Antwort

0

Der beste Weg, die Leistung der Größenanpassung zu verbessern , um ein VirtualizationStackPanel in Ihrem ScrollContentPresenter zu verwenden. Sie können dies in der Datenvorlage von beispielsweise Ihrer ListBox oder generell ItemsPanel überschreiben.

Es werden NICHT Elemente angezeigt, die nicht sichtbar sind, im Vergleich zu einem normalen StackPanel, das alle Elemente die ganze Zeit darstellt, egal ob sie für den Benutzer sichtbar sind oder nicht.

Funktioniert ganz gut für mich.

0

Folgende legt fest, ob das Element an der Offset sichtbar oder nicht gegeben:

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; 
} 

Sie es wie folgt verwenden können:

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

Ich weiß nicht, ob das für mich funktioniert, denn ich würde diese Überprüfung bei jeder Scroll-Aktivität und bei jeder einzelnen Änderung der Größe benötigen (per Mausbewegung, und das ist ziemlich oft). Ich glaube, das würde die Performance zumindest verlangsamen, da alle Elemente sichtbar und nicht kollabiert bleiben. – dalind

+0

Warum filtern Sie den Inhalt Ihrer Listbox nicht nach bestimmten Kriterien? (z. B. durch den ersten Buchstaben jedes Artikels) – CSharper

+0

Ich filtere es, aber das hat meines Erachtens nichts mit der Sichtbarkeit zu tun. Die Sichtbarkeit eines Gegenstands kann sich bei jeder Bewegung des Scrollviewers ändern, so dass das Filtern keinen Sinn ergibt, denke ich. Oder habe ich etwas missverstanden? – dalind

Verwandte Themen