在运行时生成图像

时间:2009-02-24 03:29:41

标签: c# wpf

我试图在运行时渲染一些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 个答案:

答案 0 :(得分:2)

为什么不直接在C#中生成对象而不是创建XAML然后让运行时必须解析它?这样做有以下好处:

  1. 对对象进行编译时检查。现在这样做可能会因为指法等问题而引入运行时错误。
  2. 更快地创建对象。直接在C#中实例化对象将比解析器更快。
  3. 更易于维护。下一个程序员来使用此代码将更容易使用格式良好的C#与嵌入式XAML。
  4. 可重构。您可以重构C#代码以消除重复代码。

答案 1 :(得分:0)

可能更容易自己加载图像,然后直接将其分配给生成的Image对象。从XAML创建的FrameworkElement具有Image实例的x:Name,因此您可以轻松找到它,然后直接分配给它。这样你就可以同步加载图像,而不是在你无法真正控制的背景中加载它。