我目前正在尝试实现一些报告功能,这需要我将一些 Silverlight XAML 内容转换为图像,而无需在 Silverlight 客户端上实际生成 UI。
我试图解决的问题是 - 如何将 Silverlight XAML 呈现为图像而不首先显示在 Silverlight 客户端上?我之前唯一一次这样做是使用 WriteableBitmap API 将当前显示的 UI 呈现为图像,然后根据需要转换为 PNG/JPEG。由于我可以选择呈现 XAML 服务器端,因此我希望使用 WPF 功能来呈现 XAML - 但由于它是 Silverlight XAML,这会起作用吗?
如果没有好的方法可以做到这一点,据我所知,另一种选择是尝试呈现隐藏在 PDF 查看器 Silverlight 客户端控件背景中的 UI,拉出可写位图并以这种方式生成它 - 但显然有这种方法的开销并不理想......
对此的任何想法表示赞赏,这让我在过去的几天里摸不着头脑!
最佳答案
我会尝试使用 WPF 运行时来呈现 XAML 并从中生成 BMP。通常,适用于 Silverlight 的 XAML 也适用于 WPF,但并非总是如此。
WPF 应该让您以编程方式实例化控件或加载松散的 XAML。然后你可以告诉它更新布局,最后将视觉捕捉到位图。
编辑
要在服务器上获取 xaml,我建议您在解决方案中创建一个新的 WPF 类库项目。然后“添加现有”项目到该项目并选择将所需的 xaml 文件添加为“链接”文件,而不是将它们复制进去。这样您就可以在 Silverlight 和 wpf 项目之间共享单个文件。
编译该 DLL 并在将返回图像输出的服务或页面中的服务器上使用它。在该页面中,创建用户控件的实例,设置数据上下文,并输出图像。要从视觉对象中捕获图像,您可以使用 RenderTargetBitmap。
这是一个片段:
var arrangeSize = new Size(300, 300);
var arrangeRect = new Rect(new Point(0, 0), arrangeSize);
var control = new MyControl();
control.DataContext = new MyViewModel();
control.Measure(arrangeSize);
control.Arrange(arrangeRect);
control.InvalidateVisual();
control.UpdateLayout();
RenderTargetBitmap renderTarget =
new RenderTargetBitmap(
arrangeSize.X,
arrangeSize.Y,
96,
96,
System.Windows.Media.PixelFormats.Default
);
renderTarget.Render(control);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTarget));
using (var pageOutStream = new FileStream(targetSavePath + ".png", FileMode.Create, FileAccess.Write))
{
encoder.Save(pageOutStream);
pageOutStream.Close();
}
关于wpf - 在服务器端从 Silverlight 4 XAML 生成图像,而无需在浏览器中呈现 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6663266/