我在C#中打印自定义页面。实际打印文档时,它可以正常工作,就像将其显示到对话框一样(通过相同的代码)。当代码用于PrintPreview
时,对话框以横向模式显示页面,但创建的Graphics
具有纵向文档的尺寸,因此预览无法正确显示。这是我正在使用的代码的缩减版本
using (PrintDocument pd = new PrintDocument())
{
pd.PrinterSettings.PrintToFile = false;
pd.DefaultPageSettings.Landscape = true;
pd.PrinterSettings.DefaultPageSettings.Landscape = true;
pd.DefaultPageSettings.PrinterSettings.DefaultPageSettings.Landscape = true;
PrintDialog pDialog = new PrintDialog();
pDialog.Document = pd;
pDialog.PrinterSettings.DefaultPageSettings.Landscape = true;
pDialog.PrinterSettings.PrintToFile = false;
pDialog.Document.DefaultPageSettings.Landscape = true;
PrintPreviewDialog printPreview = new PrintPreviewDialog();
printPreview.Document = pd;
printPreview.ShowDialog();
}
然后在Print_Me
对话框请求打印时调用PrintPreview
函数:
private void Print_Me(object sender, PrintPageEventArgs e)
{
using (Graphics g = e.Graphics)
{
DrawToDC(g);
e.HasMorePages = hasMorePages;
}
}
在DrawToDC
内我使用以下内容来获取尺寸,正如我所提到的,它可以正常打印并显示到对话框中:
dc.VisibleClipBounds.Width
dc.VisibleClipBounds.Height
答案 0 :(得分:4)
我有完全相同的问题,并最终找到了这个。添加一个OnQueryPageSettings委托处理程序。
void OnQueryPageSettings(object obj,QueryPageSettingsEventArgs e)
{
if (e.PageSettings.PrinterSettings.LandscapeAngle != 0)
e.PageSettings.Landscape = true;
}
和您的PrintDocument
prnDoc.QueryPageSettings + = new QueryPageSettingsEventHandler(OnQueryPageSettings);
为我修好了。
答案 1 :(得分:1)
我遇到了完全相同的问题。但是如果我用正确的宽度和高度绘制页面内容(即交换它们),一切都运行正常。
int width = dc.VisibleClipBounds.Width;
int height = dc.VisibleClipBounds.Height;
if(width < height)
{
int temp = width;
width = height;
height = temp;
}
然后根据宽度和高度绘制页面内容。
不是最好的解决方案,但确保我们总是绘制到横向页面。
答案 2 :(得分:0)
我无法找到连接大卫博尔顿解决方案的地方,但找到了另一种方法。
http://wieser-software.blogspot.co.uk/2012/07/landscape-printing-and-preview-in-wpf.html
从根本上说,您需要在DocumentPaginator的GetPage方法返回的每个DocumentPage上设置PageSize。