我试图在运行时渲染一些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生成包含图像的图像?
谢谢
答案 0 :(得分:2)
为什么不直接在C#中生成对象而不是创建XAML然后让运行时必须解析它?这样做有以下好处:
答案 1 :(得分:0)
可能更容易自己加载图像,然后直接将其分配给生成的Image对象。从XAML创建的FrameworkElement具有Image实例的x:Name,因此您可以轻松找到它,然后直接分配给它。这样你就可以同步加载图像,而不是在你无法真正控制的背景中加载它。