WPF中的图像查看器性能问题

时间:2009-07-29 17:04:38

标签: c# .net wpf performance image

我在WPF中遇到图像显示器问题。我有一个显示ImageSources的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 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并且猜测是因为你用作itemspanel的wrappanel没有虚拟化,而是使用VirtualizedStackPanel之类的虚拟化面板,或者开发你的VirtualizedWrapPanel并使用它,因为WPF标准库中没有VirtualizedWrapPanel < / p>

答案 1 :(得分:1)

它们是您在此声明的许多其他次优属性。

在大多数情况下,对您的性能影响最大的是您在此处声明的位图效果,直到最近所有位图效果都是通过软件呈现的。

此外,您将CanContentScroll设置为false,即 NOT 虚拟化包装面板具有的内容,如果您按照Arsen给出的示例,则为= true。

此外看起来你在这里做了一些扩展,如果你尝试的todo性能优化的应用程序developmnet是另一个坏主意。

这是一个糟糕的比较,浏览器显示3000个图像是完全不同的(显然他们没有从Windows资源管理器计算的位图效果)。

无论如何,他们的帖子中存在很多其他问题,但似乎你不再拥有一个帐户,这里的这几个虽然肯定会对整体产生重大影响。