5

我对 PageSettings.PrintableArea 的宽度和高度值有疑问。Width、Height 和 Size 属性声称可以“获取或设置”这些值。此外,inflate() 函数声称可以根据传入的值更改大小。

然而,所有这些改变价值的尝试都没有奏效。Inflate() 被忽略(没有错误,就像它工作一样通过,但值保持不变。

尝试设置高度、宽度或大小会导致编译器错误:“无法修改 'System.Drawing.Printing.PageSettings.PrintableArea' 的返回值,因为它不是变量”。

我觉得这意味着描述的“或设置”部分是谎言。

为什么我想知道这一点:(总有人问...)我有一个打印应用程序(C#、WinForm),它在大多数情况下都运行良好。我可以设置打印机设置和页面设置对象来控制打印对话框的打印机属性中显示的内容。但是,对于 Microsoft Office Document Image Writer,这些设置有时会被忽略,即使显示其他内容,纸张大小也会返回为 0、0。就显示的值而言,我真正希望它是所见即所得的,所以我将纸张尺寸改回应有的尺寸,但可打印区域,如果它是错误的,会使生成的图像不稳定。生成的图像是可打印区域的大小,而不是纸张大小的值。只是想知道是否有这样做的理由或让它不这样做的方法。

提前致谢。:)

更新:

  //ignored 
  PrintDocument.DefaultPageSettings.PrintableArea.Inflate(XOffset, YOffset);

 //causes compiler error
 PrintDocument.DefaultPageSettings.PrintableArea.Size = new SizeF((float)DimensionsPaperSize.Width, (float)DimensionsPaperSize.Height);
 PrintDocument.DefaultPageSettings.PrintableArea.Height = DimensionsPaperSize.Height;
 PrintDocument.DefaultPageSettings.PrintableArea.Width = DimensionsPaperSize.Width;

更新 2:

对于正确打印的(自定义尺寸)打印机,当我更改 PaperSize 时,PrintableArea 和 PageBounds 会自动更改以匹配它。当我在 MDIW 上更改 PaperSize 时,只有 PageBounds 更改。我不明白是什么原因造成的。

结论:

Nobugz 很好地解释了为什么不能设置 PrintableArea(通常永远不需要)以及为什么它的 inflate() 函数被忽略,所以我将其标记为答案。

至于促使我提出这个问题的持续存在的问题,我仍然不知所措。作为对“ScaleTranform”建议的回应,PaperSize 和 Graphics 对象已经有了正确的值,因此弄乱这些值可能没有帮助。我怀疑沿着这条路线我能做的最多就是将我正确大小的图像调整为我为 PrintableArea 获得的垃圾值。当显式设置 PaperSize 无法相应地修改 PrintableArea 时,我将假设这是与错误相关的行为。

令人沮丧的是,我似乎是唯一遇到这个问题的人。至少,到目前为止,我只观察到 MODIW 的这种行为。供任何人参考,因此有尽可能多的信息;我正在运行 32 位 Win7,在 VS2008 中开发。要复制问题,请执行以下步骤:

PrintDialog PrintDlg = new PrintDialog();
PrintDocument PrintDoc = new PrintDocument();
PrintDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(DocumentPrintPage);
PrintDlg.PrinterSettings.PrinterName = printerName; //MODIW
PrintDoc = AlterPaperSize(PrintDoc); //A function that just changes the papersize
PrintDlg.Document = PrintDoc;
PrintDlg.PrinterSettings = PrintDoc.PrinterSettings;
if (PrintDlg.ShowDialog() == DialogResult.OK)
{
   if ((PrintDoc.DefaultPageSettings.PaperSize.Width == 0) &&
       (PrintDoc.DefaultPageSettings.PaperSize.Height == 0))
   {
      PrintDoc.DefaultPageSettings.PaperSize = DimensionsPaperSize;
   }
   PrintDoc.Print();
}
4

3 回答 3

7

这是 .NET 编程的一个非常基本的问题,每个程序员都至少爱过一次。PrintableArea 属性类型是 RectangleF。那是一种结构,一种值类型。当您使用该属性时,您会取回该值的副本

编译器会注意到您正在尝试修改副本的成员,就像您尝试分配 Height 属性时一样。但是当您使用 Inflate() 方法时,它会变得很笨拙。您正在夸大副本,而不是原始值,并且编译器不够聪明,无法注意到。

这里的关键问题是 PrintableArea 属性只有一个 getter,它没有一个 setter。这意味着您无法更改它。如果您考虑一下,这是有道理的,您无法更改纸张的大小,也无法更改打印机的设计。您可能想要使用 Margins 属性。

于 2010-04-07T21:02:41.893 回答
2

好的,我知道这有点老了,所以请原谅,但我遇到了同样的问题,并且发现了如何正确设置纸张尺寸以使 PrintableArea 正确,因为这是我出现的少数帖子之一“谷歌搜索”这个问题,我想我会添加我是如何让它在这里工作的,所以下一个遇到这个问题的人会得到答案。

设置 PaperSize = New PaperSize(...) 时,您正在制作自定义尺寸,即使您将其命名为“A4”或“A5”。相反,您需要将纸张尺寸设置为 PrinterSettings.PaperSizes 中保存的标准尺寸之一。

下面是一些 C# .NET 3.5 代码,显示了我如何将 A4 和 A5 尺寸作为变量,然后我可以酌情使用它们,在我设置 PaperSize 时显示在最后一行,现在 PrintableArea 将是正确的。

IEnumerable<PaperSize> paperSizes = settings.PaperSizes.Cast<PaperSize>();
PaperSize sizeA5 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A5);
PaperSize sizeA4 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A4);
settings.DefaultPageSettings.PaperSize = sizeA5; 
于 2011-01-21T10:50:52.280 回答
1

我最近能够自己解决这个问题。分配新的纸张尺寸时: A) 您必须指定“自定义” B) 纸张尺寸有限制。我还没有弄清楚它们,它们可能与打印机有关。如果您的尺寸无效,可打印区域将变为默认的 8.5x11。可能它们必须是 10 的倍数。

.DefaultPageSettings.PaperSize = New PaperSize("Custom", 1100, 2200)

不起作用:

.DefaultPageSettings.PaperSize = New PaperSize("Custom", 1093, 2290)

如果您发现更多信息,请告诉我。

于 2010-05-18T14:44:51.393 回答