我目前正在开发一个基于瓦片的地图编辑器,专注于让滚动按我想要的方式工作。这就是我遇到一些麻烦的地方。滚动时,会生成图像,以便在滚动时显示新内容。这可以很好地工作,直到在新的一侧生成大约200个图像(System.Windows.Controls.Image
)(简单的映射,不复杂)。
每当侧面生成大约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
与其从System.Drawing.Bitmap创建ImageSource,不如使用WriteableBitmap。如果必须将复杂的绘图绘制到位图中,则必须绘制到DrawingVisual的DrawingContext中,并将该DrawingVisual渲染到RenderTargetBitmap,中
在单独的线程中创建ImageSource对象时,在UI中使用它们之前,必须调用它们的Freeze方法。