【问题标题】:Generate Image at Runtime在运行时生成图像
【发布时间】:2009-02-24 15:36:29
【问题描述】:

我正在尝试在运行时呈现一些 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 生成包含图像的图像?

谢谢

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

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

    1. 在编译时检查您的对象。您现在的操作方式可能会因为粗手指等原因引入运行时错误。
    2. 更快的对象创建。直接在 C# 中实例化对象将比解析器更快。
    3. 更易于维护。下一位使用此代码的程序员将更轻松地使用格式良好的 C# 与嵌入式 XAML。
    4. 可重构。您可以重构 C# 代码以消除重复代码。

    【讨论】:

    • 之所以是因为XAML是动态生成的。实际代码比显示的更复杂。速度不是问题,因为 XAML 在异步线程上用于从 XAML 生成 .png。不过,我担心的是如果使用图像,实际上会显示图像。
    【解决方案2】:

    自己加载图像然后直接将其分配给生成的 Image 对象可能会更容易。从 XAML 创建的 FrameworkElement 具有用于 Image 实例的 x:Name,因此您可以轻松找到它,然后直接分配给它。通过这种方式,您可以同步加载图像,而不是在您无法真正控制的后台加载图像时对其进行回复。

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多