打印控件

我想知道是否有一种简单的方法可以将C#中的任何控件打印到打印机。 我的具体示例是尝试将TableLayoutPanel打印到收据(因此我不必担心分页符或任何内容),但我希望能够打印出发送给我的任何可见对象。 现在我必须创建一个位图,然后做一个TableLayoutPanel.DrawToBitmap,但这似乎非常低效,因为我已经有了打印的Graphics对象,应该有一个简单的方法来做这个..谢谢!

编辑:我注意到有一个“ControlPaint.Draw__”,但是它没有很多可以绘制的控件(它有Border,Button,CheckBox,ComboBox)。

private static void PrintControl(Control control) { var bitmap = new Bitmap(control.Width, control.Height); control.DrawToBitmap(bitmap, new Rectangle(0, 0, control.Width, control.Height)); var pd = new PrintDocument(); pd.PrintPage += (s, e) => e.Graphics.DrawImage(bitmap, 100, 100); pd.Print(); } 

它仍在使用DrawToBitmap,但它是最优雅的你会得到的。

它非常简洁,可读且效率低,所以我认为没有理由不喜欢它。

我对自己的问题有一个答案,这个答案与我以前的方向有些不同。 在WPF中,您可以将控件绘制到任何曲面,因此我创建了一个“FlowDocument”对象并添加了包含网格,图像以及我需要显示的任何其他内容的“段落”。 我会将另一个答案标记为已接受,但我想我会添加这个以防万一有人对我最终的方向感兴趣。

 FlowDocument flowDoc = new FlowDocument(); Paragraph header = new Paragraph(); Grid imageGrid = new Grid(); imageGrid.ColumnDefinitions.Add(new ColumnDefinition()); ColumnDefinition colDef = new ColumnDefinition(); colDef.Width = new GridLength(4, GridUnitType.Star); imageGrid.ColumnDefinitions.Add(colDef); imageGrid.ColumnDefinitions.Add(new ColumnDefinition()); BitmapImage bitImage = new BitmapImage(new Uri("{...}", UriKind.RelativeOrAbsolute)); Image image = new Image(); image.Source = bitImage; image.Margin = new Thickness(10.0d); Grid.SetColumn(image, 1); imageGrid.Children.Add(image); header.Inlines.Add(imageGrid); header.Inlines.Add(new LineBreak()); header.Inlines.Add("Some text here"); header.Inlines.Add(new LineBreak()); flowDoc.Blocks.Add(header); 

应该有很多关于如何打印FlowDocument的例子,但是如果需要的话,我总是可以在示例中添加更多。