I am trying to render text on a bitmap in a Windows Phone 7 application.
Code that looks more or less like the following would work fine when it's running on the main thread:
public ImageSource RenderText(string text, double x, double y)
{
var canvas = new Canvas();
var textBlock = new TextBlock { Text = text };
canvas.Children.Add(textBloxk);
Canvas.SetLeft(textBlock, x);
Canvas.SetTop(textBlock, y);
var bitmap = new WriteableBitmap(400, 400);
bitmap.Render(canvas, null);
bitmap.Invalidate();
return bitmap;
}
Now, since I have to render several images with more complex stuff, I would like to render the bitmap on a background thread to avoid an unresponsive UI.
When I use a BackgroundWorker
to do so, the constructor for TextBlock
throws an UnauthorizedAccessException
claiming that this is an invalid cross-thread access.
My question is: how can I render text on a bitmap without blocking the UI?
- Please don't suggest using a web service to do the rendering. I need to render a large number of images and the bandwidth cost is not acceptable for my needs, and the ability to work offline is a major requirement.
- The solution doesn't necessarily has to use
WriteableBitmap
orUIElements
, if there is another way to render text.
EDIT
Another thought: does anyone know if it should be possible to run a UI message loop in another thread, and then have that thread do the work? (instead of using a BackgroundWorker
)?
EDIT 2
To consider alternatives to WriteableBitmap
, the features I need are:
- Draw a background image.
- Measure the width and height of a 1-line string, given a font familiy and size (and preferably style). No need for word wrapping.
- Draw a 1-line string, with given font family, size, style, at a given coordinate.
- Text rendering should support a transparent background. I.e. you should see the background image between the characters.