我尝试打印一封用于制作简单字母合并申请的信件。 但我很沮丧如何在WPF和.NET 4中设置打印机选项。
这是我的代码:
private void button_Print_Click(object sender, RoutedEventArgs e)
{
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true)
{
pd.PrintTicket.PageOrientation = PageOrientation.Landscape;
pd.PrintTicket.PageMediaSize = new PageMediaSize(865, 612);
pd.PrintVisual(canvas_Letter, "Letter Canvas");
}
}
在PrintDialog中,我选择了MP托盘,其中装有C5大小的字母。它打印我的WPF,但没有正确的元素位置。它像边距检测到A4纸的纸张尺寸。 即使我在PrintDialog中选择C5的纸张尺寸,打印仍然不在界限内。
知道如何将C5的大小与我的视觉效果相匹配吗?看起来我的pd.PrintTicket.PageMediaSize设置为865px宽度和612px高度不起作用:/
答案 0 :(得分:0)
不确定我是否理解你的问题。是否要打印出调整为所选纸张尺寸的canvas_Letter? 在这种情况下,我认为你必须使用'PrintCapabilities',你必须在canvas_Letter上调用Measure()和Arrange()。
这样的事情:
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true)
{
Rect printableArea = GetPrintableArea(printDlg);
// I'm using here a viewbox for easily adjust the canvas_Letter to the desired size
Viewbox viewBox = new Viewbox { Child = canvas_Letter };
viewBox.Measure(printableArea.Size);
viewBox.Arrange(printableArea);
printDlg.PrintVisual(viewBox, "Letter Canvas");
}
private static Rect GetPrintableArea(PrintDialog printDialog)
{
PrintCapabilities cap;
try
{
cap = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
}
catch (PrintQueueException)
{
return Rect.Empty;
}
if (cap.PageImageableArea == null)
{
return Rect.Empty;
}
var leftMargin = cap.OrientedPageMediaWidth.HasValue ? (cap.OrientedPageMediaWidth.Value - cap.PageImageableArea.ExtentWidth) / 2 : 0;
var topMargin = cap.OrientedPageMediaHeight.HasValue ? (cap.OrientedPageMediaHeight.Value - cap.PageImageableArea.ExtentHeight) / 2 : 0;
var width = cap.PageImageableArea.ExtentWidth;
var height = cap.PageImageableArea.ExtentHeight;
return new Rect(leftMargin, topMargin, width, height);
}