【问题标题】:Image viewer performance issues in WPFWPF 中的图像查看器性能问题
【发布时间】:2010-11-15 03:51:33
【问题描述】:

我遇到了 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 张图片小示例快)。

那么我怎样才能达到相同的速度或接近它呢?

【问题讨论】:

    标签: c# .net wpf performance image


    【解决方案1】:

    我遇到了同样的问题,我猜这是因为您用作 itemspanel 的 wrappanel 没有虚拟化,请改用 VirtualizedStackPanel 之类的虚拟化面板,或者开发您的 VirtualizedWrapPanel 并改用它,因为 WPF 标准库中还没有 VirtualizedWrapPanel

    【讨论】:

    【解决方案2】:

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

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

    另外,您将 CanContentScroll 设置为 false,这 NOT 是虚拟化包装面板所具有的,如果您遵循 Arsen 给出的示例,那将是 =true。

    此外,您似乎在此处进行了一些扩展,如果您尝试执行性能优化的应用程序开发,这又是一个坏主意。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2020-05-15
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多