Проблемы с производительностью просмотра изображений в WPF - PullRequest
1 голос
/ 29 июля 2009

У меня проблемы с отображением изображений в WPF. У меня есть ListView, отображающий источники изображения.

    <Setter Property="ItemsPanel">
        <Setter.Value>
          <ItemsPanelTemplate>
            <WrapPanel />
          </ItemsPanelTemplate>
        </Setter.Value>
      </Setter>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1">
                    <ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsGrouping" Value="true">
                        <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<DataTemplate x:Key="ImagesListerViewItemsTemplate" DataType="{x:Type ImageSource}" >
    <Border Height="150" Width="150" CornerRadius="0,0,0,0" BorderThickness="1,1,1,1" Margin="4,4,4,4" BorderBrush="#FF000000">
        <Border Margin="8,8,8,8" Background="#FFFFFFFF">
            <Border.BitmapEffect>
                <OuterGlowBitmapEffect GlowColor="#FFFFFFFF"/>
            </Border.BitmapEffect>
            <Image Source="{Binding}" />
        </Border>
    </Border>
</DataTemplate>

И загрузить картинки:

   private static BitmapImage LoadDisplayableImage(System.IO.FileInfo file)
    {
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        bi.DecodePixelWidth = 100;
        bi.DecodePixelHeight = 100;
        bi.UriSource = new Uri(file.FullName);
        bi.EndInit();

        return bi;
    }

Но тогда моя программа работает очень медленно, когда хочется прокрутить ListView или когда я пытаюсь изменить размер формы только с 49 изображениями. Для сравнения, проводник Windows может загружать до 3000 изображений на мой компьютер и отображать их все, и при прокрутке он все еще остается очень быстрым (быстрее, чем мой пример с 49 картинками).

Так, как я могу достичь той же скорости или приблизиться к ней?

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

Это ряд других неоптимальных атрибутов, которые вы объявили здесь.

По большей части самое большое влияние на вашу производительность будет иметь эффект растрового изображения, который вы объявили здесь, до недавнего времени все растровые эффекты отображались только с помощью программного обеспечения.

Кроме того, вы устанавливаете CanContentScroll в false, то есть NOT , что есть у виртуализированной панели переноса, это будет = true, если вы последуете примеру Арсена.

Кроме того, похоже, что вы выполняете здесь некоторое масштабирование, что является еще одной плохой идеей, если вы пытаетесь оптимизировать производительность приложения, разработанного в сети.

И это плохое сравнение, проводник, отображающий 3000 изображений, совершенно другой (очевидно, это не растровый эффект, вычисляемый из проводника Windows).

Как бы то ни было, у вас есть множество других проблем с вашим постом, но, похоже, у вас больше нет аккаунта, хотя эти несколько здесь, безусловно, оказали бы серьезное влияние в целом.

1 голос
/ 29 июля 2009

У меня была та же проблема, и я предполагаю, что это потому, что обертка, которую вы используете в качестве панели элементов, не виртуализирована, вместо этого используйте виртуализированные панели, такие как VirtualizedStackPanel, или разработайте вашу VirtualizedWrapPanel и используйте ее, потому что в стандартной библиотеке WPF еще нет VirtualizedWrapPanel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...