对WriteableBitmap像素的更改不会更新屏幕
在Windows Phone 8应用程序中,我有一个WriteableBitmap
,它连接到一个Image控件。 我循环遍历图像的每一行,并异步绘制一行像素,然后安排下一行进行绘制。 但是,似乎更改底层像素数据不会触发更改的属性,因此控件不会更新。 如果我将图像源设置为使用相同像素创建的新的WriteableBitmap,则图像更新正常,但我正在进行大量的过度数组复制。
void PaintImage(object state)
{
// get my height, width, row, etc. from the state
int[] bitmapData = new int[width];
// load the data for the row into the bitmap
Dispatcher.BeginInvoke(() =>
{
var bitmap = ImagePanel.Source as WriteableBitmap;
Array.Copy(bitmapData, 0, bitmap.Pixels, row * width, bitmapData.Length);
if (row < height - 1)
{
var newState = ... // create new state
ThreadPool.QueueUserWorkItem(PaintImage, newState);
}
});
}
如果我在上面的Array.Copy之后添加这些行,则位图将逐渐绘制到屏幕上(尽管实际上它只是每次都替换位图):
var newBitmap = new WriteableBitmap(width, height);
Array.Copy(bitmap.Pixels, newBitmap.Pixels, newBitmap.Pixels.Length);
ImagePanel.Source = newBitmap;
看起来像我需要手动让WriteableBitmap触发一些属性更改通知,以便拥有它的图像。 我猜这个问题会消失,如果我将图像绑定到ViewModel中的WriteableBitmap?
我认为你应该调用Invalidate()来请求重绘。 参考:http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.invalidate(v=vs.95).aspx
只需添加一个脏矩形
_myBitmap.Lock();
_myBitmap.AddDirtyRect(new Int32Rect(0, 0, _myBitmap.PixelWidth, _myBitmap.PixelHeight));
_myBitmap.Unlock();
或者如果你在后台线程
Application.Current.Dispatcher.InvokeAsync(() =>
{
_myBitmap.Lock();
_myBitmap.AddDirtyRect(new Int32Rect(0, 0, _myBitmap.PixelWidth, _myBitmap.PixelHeight));
_myBitmap.Unlock();
});
链接地址: http://www.djcxy.com/p/26881.html