当显示大量图像时,我遇到了一些性能问题,我发现问题是当我只需要小于大小的1/4的图像时,便使用了全分辨率图像。因此,我在BeginInit和EndInit之间添加了一条线,以将DecodePixelWidth设置为200,这是我在布局中所需的最大宽度。我的表现不再是问题,但是某些图像确实很小,绝对没有200像素宽的距离。大多数图像似乎都能正确显示,似乎没有任何韵律或原因使它们太小而不能正常工作。我认为这可能是由于图像原始尺寸的差异,但结果没有规律。我尝试将宽度增大到600,然后让有问题的图像以200的正确宽度显示,但随后性能下降。

在这一点上,我什至不知道从哪里开始寻找,并真的很感激朝着正确的方向前进。

编辑:下面有关图像以及我如何使用它们的更多信息。

尽管有些图像的尺寸奇怪,例如1000x1513,但大多数图像都在1000X1500左右。所有图像均为JPEG。当前,每个图像都放置在我设计的自定义用户控件中,仅在周围带有一些文本的背景上看就太有趣了。然后将每个用户控件放在其自己的行/列的网格中。网格位于滚动查看器内部,因此用户可以滚动列表。这可能不是完成我要寻找的东西的最佳方法,但是它是我很快想到的,并且在大多数情况下都有效。如果能以更简单或更简洁的方式实现我想要的功能,我很乐意切换到另一种显示方法。

预期的结果是用于电影浏览应用程序。电影将有一个可滚动的列表,每个列表都以其自己的图块表示,并包含标题,电影海报,流派信息,评分和说明。该列表将在各种项目上排序。有关电影的信息存储在另一台计算机上的sql数据库中。图像最初存储在另一台计算机上,但是在本地复制以提高性能。

编辑:我已经能够通过不使用DecodePixelWidth来解决该问题,而是以所需的大小保存图像的副本,这提高了性能。 Youngjae关于不使用DecodePixelWidth的建议,以及他提到使用虚拟化列表的建议,使我获得了以下有关创建虚拟化包装面板的文章集,该文章应解决任何其他性能问题。这篇文章是针对Silverlight的,但据我了解,Silverlight基本上是wpf的精简版本,如果它在Silverlight中工作,则应该在wpf中工作。将其转换为我的使用应该不会太困难。

Part 1 - MeasureOverride

Part 2 - ArrangeOverride

Part 3 - Animation

Part 4 - Virtualization

最佳答案

MSDN link中,您可以找到以下单词。


  JPEG和可移植网络图形(PNG)编解码器将图像本地解码为指定大小;其他编解码器以原始大小解码图像,然后将图像缩放到所需大小。


并且,由于上述原因,我建议您不要将DecodePixelWidth用于调整大小。

我不知道您的原始图像大小和格式,但是不足以与虚拟列表和<Image Width="200" Stretch="Uniform">一起使用吗?

10-05 21:46