2015-04-01 85 views
0

我想從視圖創建PNG。我正在使用此代碼:如何將視圖轉換爲PNG?

//I instance the user control 
      ucFormToPrintView miViewToPrint = new ucFormToPrintView(); 
      miViewToPrint.DataContext = ((ucFormToPrintView)CCForm).DataContext; 

      //I use a RenderTargetBitmap to render the user control 
      System.Windows.Media.Imaging.RenderTargetBitmap rtb = new System.Windows.Media.Imaging.RenderTargetBitmap(794, 1122, 72, 72, System.Windows.Media.PixelFormats.Pbgra32); 
      rtb.Render(miViewToPrint); 

      //I use an encoder to create the png 
      System.Windows.Media.Imaging.PngBitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); 
      encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb)); 


      //I use a dialog to select the path where to save the png file 
      Microsoft.Win32.SaveFileDialog saveFileDialog = new Microsoft.Win32.SaveFileDialog(); 

      saveFileDialog.FilterIndex = 1; 

      if (saveFileDialog.ShowDialog() == true) 
      { 

       using (System.IO.Stream stream = saveFileDialog.OpenFile()) 
       { 

        encoder.Save(stream); 

        stream.Close(); 

        System.Diagnostics.Process.Start(saveFileDialog.FileName); 
       } 
      } 

結果是一個空的png。

如何從用戶控件創建png文件?

非常感謝。

+0

嘗試在'using'語句之外移動'Process.Start'調用,並去掉'stream.Close();'行。你的代碼的其餘部分看起來沒問題。 – 2015-04-01 15:22:20

回答

1

UserControl必須佈置至少一次才能看到。您可以通過調用其方法MeasureArrange來實現該目的。

var miViewToPrint = new ucFormToPrintView(); 
miViewToPrint.DataContext = ((ucFormToPrintView)CCForm).DataContext; 

// layout, i.e. measure and arrange 
miViewToPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
miViewToPrint.Arrange(new Rect(miViewToPrint.DesiredSize)); 

... 

if (saveFileDialog.ShowDialog() == true) 
{ 
    using (var stream = saveFileDialog.OpenFile()) 
    { 
     encoder.Save(stream); 
    } 

    System.Diagnostics.Process.Start(saveFileDialog.FileName); 
}