wpf - 在服务器端从 Silverlight 4 XAML 生成图像,而无需在浏览器中呈现 UI

标签 wpf xaml silverlight-4.0 c#-4.0

我目前正在尝试实现一些报告功能,这需要我将一些 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/

相关文章:

c# - 重用具有不同 ViewModel 的 usercontrol(View)

c# - 使用带有 Caliburn micro Message.Attach 的附加事件

silverlight-4.0 - RIA 服务异步调用链上 silverlight

c# - 如何自动生成导航包含的实体?

WPF 和 MVVM。显示和隐藏带有超时的标签

c# - 图像与位图图像与位图

wpf - 如何更改平面按钮样式的边框颜色

c# - 使用 WPF WebBrowser 控件进行拖放 - 放置事件未触发

java - 由于 Java 版本,Xamarin Forms Previewer 在 Visual Studio 中不适用于 Android

wpf - 使 silverlight UserControl 填充内容控件中的可用空间