Я пытаюсь отобразить текст на растровом изображении в приложении Windows Phone 7.
Код, более или менее похожий на следующий, будет нормально работать, когда он выполняется в основном потоке:
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;
}
Теперь, когда мне нужно визуализировать несколько изображений с более сложными материалами, я хотел бы визуализировать растровое изображение в фоновом потоке, чтобы избежать зависания пользовательского интерфейса.
Когда я использую BackgroundWorker
для этого, конструктор для TextBlock
выдает UnauthorizedAccessException
, утверждая, что это недопустимый доступ между потоками.
Мой вопрос: как я могу визуализировать текст на растровом изображении, не блокируя пользовательский интерфейс?
- Пожалуйста, не предлагайте использовать веб-сервис для рендеринга. Мне нужно отрендерить большое количество изображений, а стоимость полосы пропускания неприемлема для моих нужд, а возможность работы в автономном режиме является основным требованием.
- Решение не обязательно должно использовать
WriteableBitmap
илиUIElements
, если есть другой способ визуализации текста.
ИЗМЕНИТЬ
Еще одна мысль: кто-нибудь знает, можно ли запустить цикл сообщений пользовательского интерфейса в другом потоке, а затем заставить этот поток выполнять работу? (вместо использования BackgroundWorker
)?
ИЗМЕНИТЬ 2
Чтобы рассмотреть альтернативы WriteableBitmap
, мне нужны следующие функции:
- Нарисуйте фоновое изображение.
- Измерьте ширину и высоту однострочной строки с учетом семейства и размера шрифта (и, желательно, стиля). Нет необходимости в переносе слов.
- Нарисуйте однострочную строку с заданным семейством шрифтов, размером, стилем по заданной координате.
- Рендеринг текста должен поддерживать прозрачный фон. Т.е. вы должны увидеть фоновое изображение между персонажами.