Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:如何将大量大图像快速加载到wrappanel中?_C#_Wpf_Image_Wrappanel - Fatal编程技术网

C# WPF:如何将大量大图像快速加载到wrappanel中?

C# WPF:如何将大量大图像快速加载到wrappanel中?,c#,wpf,image,wrappanel,C#,Wpf,Image,Wrappanel,我有大约45个中等大小的图像(约680x1000),需要加载到一个简单的用户控件中(带有填充、图像、文本块和两个侧矩形的倒圆后序),然后以包装形式显示。虚拟化在这里并没有真正的帮助,因为图像在程序加载时都是可见的 我知道在BitmapImage init内部,我可以设置decodepixel宽度,这确实有点帮助,但是我想将它们全部加载为全尺寸,因为我希望能够使用滑块调整图像大小,而不会丢失质量(这部分在大多数情况下工作得很快)。我知道一种可能是将decodewidth设置为某个数字,我将其设置为

我有大约45个中等大小的图像(约680x1000),需要加载到一个简单的用户控件中(带有填充、图像、文本块和两个侧矩形的倒圆后序),然后以包装形式显示。虚拟化在这里并没有真正的帮助,因为图像在程序加载时都是可见的

我知道在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);
示例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>

更新:


最后,我在一个后台工作程序中运行加载图像循环,使其响应速度更快。加载每个图像后,调用Dispacher.Invoke来创建包装项。在玩了一段时间后,我让它显示每个项目,因为它是在之前创建的同一时间创建的。

如果您对整体性能感到满意,只需加载图像,您可以尝试我设法让它非常容易地工作,但是,如果在循环中加载所有图像,则在加载完所有图像之前,它不会更新视觉效果。然而,UI在这段时间内是有响应的,因为所有加载都在一个单独的线程上


或者,如果您在循环中加载所有图像,则可以尝试(向下滚动到示例)。您可以在加载每个图像后调用它,它将给UI一个自我更新的机会(处理用户交互等)。这是我在为我的项目加载地图分幅时使用的方法,比第一种方法更简单。

我认为我的主要问题是实际将图像从磁盘加载到内存中。我不确定这里是否有我真正能解决的问题,是吗?我将所有图像加载到一个列表中,然后生成所有包含列表中位图图像引用的换行项目。我可以清除所有包装子项并快速重新创建它们,但加载本身需要几秒钟。我尝试了一个并行的.For循环来将映像加载到列表中,但这导致它们的加载速度大大降低,可能是由于异步磁盘访问。