我在想,如果有一个简单的方法,在C#中的任何控制打印到打印机。 我的具体的例子试图打印一个TableLayoutPanel的收据(所以我不担心分页或任何东西),但我想打印出来发送给我任何可见物体的能力。 现在,我要创建一个位图,然后做一个TableLayoutPanel.DrawToBitmap,但这似乎非常低效的,因为我已经有了Graphics对象进行打印,应该有一个简单的方法来做到这一点..谢谢!
编辑:我注意到,有一个“ControlPaint.Draw__”,但它并没有很多的控制是能够利用(有边框,按钮,复选框,组合框)..
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的例子,但如果这是需要,我可以随时添加更多的例子。