In einer WPF-ListBox mit mehr als 1000 Bildelementen werden die Zoombilder langsam


Answers

  1. Ich bin mit dieser Komponente nicht vertraut, aber im Allgemeinen gibt es Einschränkungen hinsichtlich der Anzahl der Elemente, die eine Listbox gleichzeitig anzeigen kann.

  2. Eine Methode, um diese Art von Problem zu lösen, besteht darin, die Anzahl der Bilder, die in die Steuerung geladen werden, innerhalb der Anzahl zu halten, die die Steuerung bei annehmbaren Leistungspegeln anzeigen kann. Zwei Techniken dafür sind Paging oder dynamisches Laden.

Beim Seitenwechsel fügen Sie Steuerelemente hinzu, um zwischen einzelnen Bildblöcken (z. B. 100 gleichzeitig) mit Vorwärts- und Rückwärtspfeilen zu wechseln, ähnlich wie beim Navigieren in Datenbankdatensätzen.

Beim dynamischen Laden implementieren Sie das Paging hinter den Kulissen so, dass die Anwendung beim nächsten Bildlauf automatisch die nächste Bilderserie lädt und möglicherweise sogar einen Stapel alter Bilder entfernt, um die Reaktionszeit angemessen zu halten. Es kann eine kleine Pause geben, wenn dies geschieht, und es kann einige Arbeit erforderlich sein, um die Steuerung am richtigen Rollpunkt zu halten, aber dies kann ein akzeptabler Kompromiss sein.

Question

Ich habe ein Problem beim Entwickeln einer Fotobetrachtungsanwendung gefunden. Ich verwende ListBox, um Bilder anzuzeigen, die in einer ObservableCollection enthalten sind. Ich binde die ItemsSource der ListBox an die ObservableCollection.

  <DataTemplate DataType="{x:Type modeldata:ImageInfo}">
        <Image 
            Margin="6"
            Source="{Binding Thumbnail}"
            Width="{Binding ZoomBarWidth.Width, Source={StaticResource zoombarmanager}}"
            Height="{Binding ZoomBarWidth.Width, Source={StaticResource zoombarmanager}}"/>
  </DataTemplate>

<Grid DataContext="{StaticResource imageinfolder}">
    <ScrollViewer
        VerticalScrollBarVisibility="Auto" 
        HorizontalScrollBarVisibility="Disabled">
        <ListBox Name="PhotosListBox"
            IsSynchronizedWithCurrentItem="True"
            Style="{StaticResource PhotoListBoxStyle}" 
            Margin="5"
            SelectionMode="Extended" 
            ItemsSource="{Binding}" 
           />
    </ScrollViewer>

Ich binde auch die Image'height in ListBox mit einem Schieberegler (der Wert des Sliders ist auch an zoombarmanager.ZoomBarWidth.Width gebunden). Aber ich fand heraus, ob die Sammlung größer wurde, zB: enthält mehr als 1000 Bilder. Wenn ich den Schieberegler benutze, um die Größe der Bilder zu ändern, wird es etwas langsam. Meine Frage ist. 1. Warum wird es langsam? Es wird versucht, jedes Bild zu zoomen, oder es wird einfach, weil notify ("Width") mehr als 1000 mal aufgerufen wird. 2. Gibt es irgendeine Methode, um diese Art von Problem zu lösen und es schneller zu machen.

Der PhotoListBoxStyle ist so:

    <Style~~ TargetType="{x:Type ListBox}" x:Key="PhotoListBoxStyle">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBox}" >
                    <WrapPanel 
                        Margin="5" 
                        IsItemsHost="True" 
                        Orientation="Horizontal" 
                        VerticalAlignment="Top"                             
                        HorizontalAlignment="Stretch" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style~~>

Aber wenn ich den Stil oben benutze, muss ich ScrollViewer außerhalb von ListBox verwenden, sonst habe ich keine Ahnung, wie man einen Scrollbalken mit glatter Scrollfunktion erhält und das Wrapping scheint keine Scrollerbar zu haben. Irgendeine Hilfe? Es wird gesagt, dass Listbox mit Scrollviewer eine schlechte Performance hat.




Wie sieht Ihr PhotoListBoxStyle-Stil aus? Wenn es die ItemsPanelTemplate der ListBox ändert, besteht eine gute Chance, dass Ihre ListBox kein VirtualizingStackPanel als darunter liegendes Listenfeld verwendet. Nicht virtualisierte Listenfelder sind bei vielen Elementen viel langsamer.




Versuchen Sie, Ihren Stackpael mit der angefügten Eigenschaft VirtualizingStackPanel.IsVirtualizing = "True" zu virtualisieren. Dies sollte die Leistung erhöhen.

Die Verwendung einer Listbox mit vielen Elementen in einem Scrollviewer ist ein weiteres bekanntes Leistungsproblem innerhalb von wpf. Versuchen Sie, wenn möglich, den Scrollviewer zu entfernen.

Wenn Ihre itemtemplates etwas komplex sind, sollten Sie den Recycling VirtualizationMode verwenden. Dadurch wird Ihre Listbox angewiesen, vorhandene Objekte wiederzuverwenden und nicht ständig neue zu erstellen.