WPF:如何快速加载大量的大图像到wrappanel?

use*_*527 6 c# wpf image wrappanel

我有大约45个相当大的图像(大约680x1000),需要加载到一个简单的用户控件(带填充,图像,文本块和2个侧面矩形的圆形后边框),然后显示在一个wrappanel中.虚拟化在这里确实没有用,因为图像在程序加载时都是可见的.

我知道在BitmapImage init里面我可以设置decodepixel宽度,这确实有点帮助,但是我喜欢将它们全部加载为全尺寸,因为我想能够用滑块调整图像大小而不会丢失质量(这部分工作得很快)在大多数情况下).我知道一种可能性是将decodewidth设置为某​​个数字,我设置为最大可视大小可以帮助.

我尝试了如何在后台加载图像中找到的多线程方法(第一个答案),但它导致程序加载时间更长!

有任何想法吗?

当前加载代码:

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
//bmp.DecodePixelWidth = 400;
bmp.UriSource = new Uri(file.FullName);
bmp.EndInit();
bmp.Freeze();
images.Add(bmp);
Run Code Online (Sandbox Code Playgroud)

示例XAML代码:

        <Border x:Name="backBorder" Background="Black" Padding="2" Margin="3" CornerRadius="3,3,4,4" 
            BorderBrush="Black" BorderThickness="1"
            MouseEnter="backBorder_MouseEnter" MouseLeave="backBorder_MouseLeave" MouseLeftButtonUp="backBorder_MouseLeftButtonUp" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="16" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="15" />
        </Grid.ColumnDefinitions>
        <Image x:Name="imageBox" Stretch="Fill" Width="{Binding Path=ImageWidth, ElementName=me}" Height="{Binding Path=ImageHeight, ElementName=me}" />
        <Border x:Name="backRatingBorder" Grid.Column="1" Margin="3,0,0,0" BorderBrush="Blue" Background="White" BorderThickness="1"/>
        <Border x:Name="frontRatingBorder" Grid.Column="1" Margin="3,0,0,0" BorderBrush="Blue" Background="LightBlue" BorderThickness="1" VerticalAlignment="Bottom" Height="50"/>
        <TextBlock x:Name="textBlock" Grid.Row="1" Grid.ColumnSpan="2" TextAlignment="Center" Background="Transparent" Foreground="White" FontFamily="Segoe UI" FontWeight="SemiBold" FontSize="12" />
   </Grid>
</Border>
Run Code Online (Sandbox Code Playgroud)

.

更新:

好吧,我最终通过在单个后台工作程序中运行加载映像循环使其响应更快.加载每个图像后,调用Dispacher.Invoke以创建包装项.在玩了一段时间之后,我得到它来显示每个项目,因为它是在它之前的同一时间创建的.

Sam*_*uel 1

如果您对整体性能(仅对图像的加载)感到满意,您可以尝试此多线程 UI 教程。我设法让它很容易地工作,但如果你在循环中加载所有图像,它不会更新视觉效果,直到你完成加载所有图像。然而,UI 在此期间是响应式的,因为所有加载都在单独的线程上进行。

或者,如果您要循环加载所有图像,那么您可以尝试Windows 窗体 DoEvents 方法的改进版本(向下滚动到示例)。您可以在加载每个图像后调用它,它会给 UI 一个自我更新的机会(处理用户交互等)。这是我在为我的项目加载地图图块时使用的方法,并且比第一种方法更容易。