对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

上一篇: Changes to WriteableBitmap pixels don't update screen

下一篇: RenderTargetBitmap and DPI