Создать изображение во время выполнения - PullRequest
3 голосов
/ 24 февраля 2009

Я пытаюсь отобразить некоторые XAML во время выполнения. Мой XAML динамически создается в StringBuilder. В качестве примера приведем пример:

StringBuilder xaml = new StringBuilder(); 
xaml.Append("<Canvas xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" "); 
xaml.Append("xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" Height=\"135\" "); 
xaml.Append("Width=\"210\" Background=\"White\" x:Name=\"Page\">"); 

string url = "http://www.mydomain.com/images/background.png"; 
xaml.Append("<Image Width=\"300\" Height=\"200\" Canvas.Left=\"0\" Canvas.Top=\"0\" "); 
xaml.Append("x:Name=\"bgImage\" Source=\""); 
xaml.Append(url); 
xaml.Append("\" />"); 

xaml.Append("</Canvas>"); 

Обратите внимание на элемент Image в этом примере. Если я помещаю этот XAML в файл .xaml, он работает нормально. Если я вставлю его в Blend, он будет работать нормально. Однако мне нужно подождать, пока загрузится это изображение, а затем преобразовать отрендеренный XAML в .png. Для этого я использую следующий код:

StringReader stringReader = new StringReader(xaml.ToString()); 
XmlTextReader xmlReader = new XmlTextReader(stringReader); 
FrameworkElement frameworkElement = (FrameworkElement)(XamlReader.Load(xmlReader)); 
Size availableSize = new Size(300, 200); 
frameworkElement.Measure(availableSize); 
frameworkElement.Arrange(new Rect(availableSize)); 

BitmapSource bitmap = RenderToBitmap(frameworkElement); 
PngBitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(bitmap)); 

FileStream fileStream = new FileStream(filename, FileMode.Create); 
encoder.Save(fileStream); 
fileStream.Close(); 

Проблема в том, что .png, который генерируется, всегда игнорирует элемент Image. Я предполагаю, потому что источник изображения не загружен. Как мне сгенерировать образ из некоторого XAML во время выполнения, который включает в себя образ?

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 февраля 2009

Почему бы просто не сгенерировать объект непосредственно в C # вместо создания XAML, а затем иметь время выполнения для его анализа? Это дает следующие преимущества:

  1. Проверка ваших объектов во время компиляции. То, как вы делаете это сейчас, может привести к ошибкам во время выполнения из-за аппликатуры и т. Д.
  2. Более быстрое создание объектов. Создание объектов непосредственно в C # будет быстрее, чем анализатор.
  3. Больше возможностей для сопровождения. Следующим программистам, которые придут и будут работать с этим кодом, будет проще с хорошо отформатированным C # по сравнению со встроенным XAML.
  4. Refacturable. Вы можете изменить код C # для устранения повторяющегося кода.
0 голосов
/ 24 февраля 2009

Может быть проще загрузить изображение самостоятельно, а затем напрямую назначить его сгенерированному объекту изображения. FrameworkElement, созданный из XAML, имеет x: Name для экземпляра Image, поэтому вы можете легко найти его и затем назначить непосредственно ему. Таким образом, вы загружаете изображение синхронно и не отвечаете на его загрузку в фоновом режиме, над которым у вас нет реального контроля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...