我想知道是否有一种简单的方法可以将C#中的任何控件打印到打印机。我的具体示例是尝试将TableLayoutPanel打印到收据(因此我不必担心分页符或任何内容),但我希望能够打印出发送给我的任何可见对象。现在我必须创建一个位图,然后做一个TableLayoutPanel.DrawToBitmap,但这看起来非常低效,因为我已经有了打印的Graphics对象,应该有一个简单的方法来做到这一点..谢谢!
编辑:我注意到有一个“ControlPaint.Draw__”,但它没有很多可以绘制的控件(它有Border,Button,CheckBox,ComboBox)..
答案 0 :(得分:6)
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,但它会让你感到最优雅。
它非常简洁,可读且效率不高,所以我认为没有任何理由不喜欢它。
答案 1 :(得分:0)
我对自己的问题有一个答案,它的方向与我之前的情况有所不同。在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的示例,但如果需要,我总是可以在示例中添加更多。