2014-09-04 89 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); 
}