3

我在显示大量图像时遇到了一些性能问题,我发现问题是当我真的只需要小于 1/4 大小的图像时使用的是全分辨率图像。所以我在 BeginInit 和 EndInit 之间添加了一条线,将 DecodePixelWidth 设置为 200,这是我在布局中需要的最大宽度。我的表现不再是问题,但有些图像非常小,绝对没有接近 200 像素宽。大多数图像似乎都可以正确显示,并且似乎没有任何韵律或理由太小并且可以正常工作。我认为这可能是由于图像原始尺寸的差异,但结果没有模式。

在这一点上,我什至不确定从哪里开始寻找,并且非常感谢您朝着正确的方向前进。

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

大多数图像的尺寸约为 1000X1500,尽管有些图像的尺寸很奇怪,例如 1000x1513。所有图像均为JPEG。目前,每个图像都放置在我设计的自定义用户控件中,没有什么太花哨的只是围绕它的背景和一些文本。然后每个用户控件被放置在一个网格中,在它自己的行/列中。网格位于滚动查看器内,因此用户可以滚动列表。这可能不是完成我正在寻找的东西的最佳方式,但它是我快速想出的,并且在大多数情况下都有效。如果它能以更简单或更简洁的方式完成我想要的,我很乐意切换到另一种显示方法。

预期的结果是用于电影浏览应用程序。将有一个可滚动的电影列表,每部都表示为自己的图块,包括标题、电影海报、流派信息、评级和描述。此列表可按各种项目排序。有关电影的信息存储在另一台机器上的 sql 数据库中。图像最初存储在另一台机器上,但被复制到本地以提高性能。

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

第 1 部分 - MeasureOverride

第 2 部分 - ArrangeOverride

第 3 部分 - 动画

第 4 部分 - 虚拟化

4

1 回答 1

2

MSDN 链接中,您可以找到如下文字。

JPEG 和便携式网络图形 (PNG) 编解码器本机将图像解码为指定大小;其他编解码器以原始大小解码图像并将图像缩放到所需大小。

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

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

于 2013-02-04T04:35:22.497 回答