我在显示大量图像时遇到了一些性能问题,我发现问题是当我真的只需要小于1/4大小的图像时,正在使用全分辨率图像。所以我在BeginInit和EndInit之间添加了一行来将DecodePixelWidth设置为200,这是我在布局中需要的最大宽度。我的表现不再是问题,但有些图像非常小,绝对不会接近200像素宽。大多数图像似乎都能正确显示,并且似乎没有任何押韵或理由太小而且工作正常。我认为这可能是由于图像原始尺寸的差异,但结果没有模式。我尝试将宽度调高到600,然后允许有问题的图像以200的正确宽度显示,但性能会受到影响。
此时我甚至不确定从哪里开始寻找,并且真的很感激能朝正确的方向迈进。
编辑:下面有关图像以及我如何使用它们的更多信息。
大多数图像大约是1000X1500,尽管有些图像有1000x1513等奇数尺寸。所有图像都是JPEG。目前,每个图像都放在我设计的自定义用户控件中,没有什么太花哨的只是它周围的背景和一些文本。然后将每个用户控件放置在其自己的行/列中的网格中。网格位于滚动查看器内,因此用户可以滚动列表。这可能不是实现我正在寻找的最佳方式,但它是我想出的最快的方式,它在很大程度上起作用。我很乐意切换到另一种显示方法,如果它能以更简单或更简洁的方式完成我想要的东西。
预期的结果是电影浏览应用。将有一个可滚动的电影列表,每个电影都表示为自己的图块,包括标题,电影海报,流派信息,评级和描述。此列表将对各种项目进行排序。有关电影的信息存储在另一台机器上的sql数据库中。图像最初存储在另一台计算机上,但会在本地复制以提高性能。
编辑:我已经能够通过不使用DecodePixelWidth来解决问题,而是以所需的大小保存图像的副本,这提高了性能。 Youngjae建议不使用DecodePixelWidth以及他提到的使用虚拟化列表,这使我得到了以下关于创建虚拟化包装面板的文章,这些文章应解决任何其他性能问题。这篇文章是针对silverlight的,但据我所知,silverlight基本上是wpf的淡化版本,如果它在silverlight中工作,它应该在wpf中工作。转换它以供我使用应该不会太难。答案 0 :(得分:2)
在MSDN link中,您可以找到以下字词。
JPEG和便携式网络图形(PNG)编解码器本机将图像解码为指定大小;其他编解码器以原始大小解码图像,并将图像缩放到所需大小。
并且,由于上述原因,我建议您不要使用DecodePixelWidth来调整大小。
我不知道您的原始图片尺寸和格式,但是还不足以使用虚拟列表和<Image Width="200" Stretch="Uniform">
?