2015-04-01 83 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); 
}