如何在 WriteableBitmap 上写入文本?

How do I write text on WriteableBitmap?

现在我正在编写游戏代码,我需要将文本绘制到 WriteableBitmap 上;如果不从 WritableBitmap 转换为 Bitmap 再到 WriteableBitmap,我该怎么做?我已经搜索过解决方案,但所有这些都会降低我的游戏速度,或者需要像 Silverlight 这样的东西才能工作。

像这样:

public class ResourceCounter : UIElement
{

    public ResourceCounter()
    {
        RenderBounds = new Bound(new Point(0, 0),
                                 new Point(600, 30));
    }

    private string goldAmt;
    private string woodAmt;
    private string stoneAmt;

    public override void Tick()
    {
        goldAmt = GlobalResources.Gold.ToString();
        woodAmt = GlobalResources.Wood.ToString();
        stoneAmt = GlobalResources.Stone.ToString();
    }

    public override void Draw(WriteableBitmap bitmap)
    {
        bitmap.FillRectangle(RenderBounds.A.X,
        Renderbounds.A.Y,
        Renderbounds.B.X,
        Renderbounds.B.Y,
        Colors.DarkSlateGray);
        bitmap.DrawString("text", other parameters...");
    }

}

您可以在 Bitmap 和 BitmapSource 之间共享像素缓冲区

var writeableBm1 = new WriteableBitmap(200, 100, 96, 96, 
    System.Windows.Media.PixelFormats.Bgr24, null);

var w = writeableBm1.PixelWidth;
var h = writeableBm1.PixelHeight;
var stride = writeableBm1.BackBufferStride;
var pixelPtr = writeableBm1.BackBuffer;

// this is fast, changes to one object pixels will now be mirrored to the other 
var bm2 = new System.Drawing.Bitmap(
    w, h, stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, pixelPtr);

writeableBm1.Lock();

// you might wanna use this in combination with Lock / Unlock, AddDirtyRect, Freeze
// before you write to the shared Ptr
using (var g = System.Drawing.Graphics.FromImage(bm2))
{
    g.DrawString("MyText", new Font("Tahoma", 14), System.Drawing.Brushes.White, 0, 0);
}

writeableBm1.AddDirtyRect(new Int32Rect(0, 0, 200, 100));
writeableBm1.Unlock();