2014-09-04 86 views
1

我有一个XAML WPF控件,我用数据填充,然后允许用户从我们的WPF应用程序打印。如何生成要从Web服务打印的XAML WPF文档?

现在我们需要能够从(无头)Web服务中填充和打印相同的文档。我试图添加我们的WPF项目作为(弱)的参考,希望它可能只是工作,但视觉工作室的行为就像它无法找到程序集(参考上的黄色警告图标,并且找不到该程序集找不到该程序集,并且找不到该程序集找不到该程序集,并且找不到该程序集编译时相关的命名空间),尽管当我双击它时,它使我成功地访问了程序集的对象浏览器。

我宁愿不只是从服务启动GUI EXE。如果可能的话,我宁愿进行无头处理。

有没有人这样做?

+0

'RenderTargetBitmap'可能是一种选择,它可以让你创建'WPF'元素,并保存为'BitmapImage',你可以再打印,http://msdn.microsoft.com/en-us /library/system.windows.media.imaging.rendertargetbitmap(v=vs.110).aspx – 2014-09-04 01:30:46

回答

0

是的,我现在这样做,这是我的代码。我还必须添加一些额外的代码,以便在使用STA Apartment State的单独线程中运行它,作为所需的一些控件,不确定是否也需要这样做。

(此代码是在VB.NET(不要问),但因此它在C#中,所以它格式化由计算器更多更好的我使用一个在线转换器)。

不要改变屏幕DPI因为这是一个Windows默认(也不要问)。

private byte[] Render(FrameworkElement element) 
{ 
    const double SCREEN_DPI = 96.0; 
    const double TARGET_DPI = 300.0; 

    // Setup the bounds of the image 
    Rect bounds = new Rect(0, 0, element.Width, element.Height); 
    element.Measure(bounds.Size); 
    element.Arrange(bounds); 
    element.UpdateLayout(); 


    // Create the target bitmap 
    RenderTargetBitmap rtb = new RenderTargetBitmap(
     Convert.ToInt32(element.Width/SCREEN_DPI * TARGET_DPI), 
     Convert.ToInt32(element.Height/SCREEN_DPI * TARGET_DPI), 
     TARGET_DPI, TARGET_DPI, PixelFormats.Pbgra32); 

    // Render the visual to the bitmap. 
    rtb.Render(element); 

    System.Windows.Media.Imaging.BitmapEncoder encoder; 
    encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); 
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb)); 

    var ms = new System.IO.MemoryStream(); 
    encoder.Save(ms); 
    ms.Flush(); 
    ms.Seek(0, System.IO.SeekOrigin.Begin); 
}