1

我目前正在开发一个基于图块的地图编辑器,专注于让滚动完全按照我的意愿工作。这就是我遇到一些麻烦的地方。滚动时,会生成图像以在您滚动时显示新内容。这可以正常工作,直到System.Windows.Controls.Image在新的一侧生成大约 200 个图像( )(简单的地图,不复杂)。

每当在侧面生成大约 1000 张图像(或者更多,如果您滚动得更快..),应用程序将挂起一段时间,具体取决于您滚动的速度等。

这种暂时挂断的原因总是由这条线路引起的。删除这条线完全消除了“滞后”(但显然没有给出想要的结果):

img.Source = it.GetFullSpriteSource(0);

该方法生成一个 ImageSource,如果已经生成,则返回存储在变量中的 ImageSource。问题不在于这种方法,因为下面的场景给出了同样的问题。

public static ImageSource yellowimg;
[...]
System.Drawing.Bitmap derp = new System.Drawing.Bitmap(32, 32);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(derp))
    g.FillRectangle(System.Drawing.Brushes.Yellow, 0, 0, 32, 32);
yellowimg = Utilities.ToImgSource(derp);
[...]
img.Source = yellowimg;

所以问题可能在于我分配了 ImageSource。

我正在从这样的位图中生成一个 ImageSource,可能是相关的:

public static ImageSource ToImgSource(Bitmap bitmap)
{
    return Imaging.CreateBitmapSourceFromHBitmap(
      bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
      BitmapSizeOptions.FromEmptyOptions());
}

我也尝试过在单独的线程中生成(后台生成),但这会导致以下错误,尝试从另一个线程读取 ImageSource。

The calling thread cannot access the object because different thread owns it


我可以尝试什么?

请记住,我对 WPF(最近开始)并不先进,而且我对ImageSource.

谢谢,

〜Tgys

4

1 回答 1

0

Instead of creating an ImageSource from a System.Drawing.Bitmap you should use WriteableBitmap. If you have to draw complicated drawing into the bitmap, you would have to draw into the DrawingContext of a DrawingVisual and render that DrawingVisual into a RenderTargetBitmap,

When you create ImageSource objects in a separate thread, you have to call their Freeze method before using them in the UI.

于 2012-08-30T13:49:20.887 回答