C#Bug中的可打印区域?

C#Bug中的可打印区域?,c#,winforms,printing,system.printing,C#,Winforms,Printing,System.printing,我对PageSettings.PrintableArea的宽度和高度值有问题。宽度、高度和大小属性声明“获取或设置”这些值。另外,函数的作用是根据传入的值更改大小 但是,所有这些更改值的尝试都没有成功。Inflate()是ignore(无错误,只是像工作一样传递,但值保持不变) 试图设置高度、宽度或大小时出现编译器错误:“无法修改“System.Drawing.Printing.PageSettings.PrintableArea”的返回值,因为它不是变量” 我觉得这意味着描述的“或设置”部分是

我对PageSettings.PrintableArea的宽度和高度值有问题。宽度、高度和大小属性声明“获取或设置”这些值。另外,函数的作用是根据传入的值更改大小

但是,所有这些更改值的尝试都没有成功。Inflate()是ignore(无错误,只是像工作一样传递,但值保持不变)

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

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

为什么我想知道这个:(有人总是问…)我有一个打印应用程序(C#,WinForm)这在大多数情况下都很好。我可以设置打印机设置和页面设置对象,以控制打印对话框的打印机属性中显示的内容。但是,使用Microsoft Office Document Image Writer,这些设置有时会被忽略,即使在显示其他内容时,纸张大小也会返回0,0。我所做的一切我希望它在显示值范围内是WYSIWYG,所以我将纸张大小改回应该的大小,但如果打印区域错误,则会使生成的图像不稳定。生成的图像是可打印区域的大小,而不是纸张大小中的值。只是想知道这是有原因的,还是没有办法得到它这样做

提前感谢。:)

更新:

  //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:

对于正确打印的(自定义大小)打印机,当我更改纸张大小时,可打印区域和页面边界会自动更改以匹配它。当我在MDIW上更改纸张大小时,只有页面边界会更改。我不明白是什么原因造成的

结论:

Nobugz在解释为什么不能设置PrintableArea(通常也不需要设置)以及为什么忽略它的inflate()函数方面做得很好,所以我将此标记为答案

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

令人沮丧的是,我似乎是唯一遇到这个问题的人。至少,到目前为止,我只观察到莫迪的这种行为。供任何人参考,因此有尽可能多的信息;我正在运行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();
}

这是.NET编程中的一个非常基本的问题,每个程序员至少会对它感兴趣一次。PrintableArea属性类型为RectangleF。这是一种结构,一种值类型。当您使用该属性时,将返回该值的副本

编译器会注意到您正试图修改副本的一个成员,就像您试图分配Height属性时一样。但是当您使用Inflate()方法时,它会变得很棘手。您正在膨胀副本,而不是原始值,并且编译器没有足够的智能来注意到这一点


这里的关键问题是PrintableArea属性只有一个getter,而没有setter。这意味着你不能改变它。如果你仔细想想,这是有道理的,你不能改变纸张的大小,也不能改变打印机的设计。您可能想使用边距属性。

最近我自己就能够解决这个问题。 指定新纸张尺寸时: A) 您必须指定“自定义” B) 纸张尺寸有限制。我还没有弄明白,它们可能依赖于打印机。如果大小无效,可打印区域将成为默认的8.5x11。可能它们必须是10的倍数

.DefaultPageSettings.PaperSize = New PaperSize("Custom", 1100, 2200)
不起作用:

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

如果你有更多的发现,请告诉我。

好的,我知道这有点旧,所以是同位语,但我也有同样的问题,我发现了如何正确设置纸张大小,使可打印区域正确,因为这是当我“谷歌”搜索问题时出现的少数帖子之一,我想我会在这里添加我是如何使其工作的,所以下一个绊倒的人会得到答案

当设置PaperSize=新的PaperSize(…)时,即使您将其命名为“A4”或“A5”,您也在创建自定义尺寸。相反,您需要将纸张大小设置为PrinterSettings.PaperSize中保存的标准大小之一

下面是一些C#.NET 3.5代码,显示了我如何将A4和A5尺寸作为变量,然后根据需要使用,如最后一行所示。当我设置纸张尺寸时,现在可打印区域将是正确的

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; 
IEnumerable paperSizes=设置.paperSizes.Cast();
PaperSize sizeA5=paperSizes.First(大小=>大小.种类==PaperKind.A5);
PaperSize sizeA4=PaperSize.First(大小=>大小.种类==PaperKind.A4);
settings.DefaultPageSettings.PaperSize=sizeA5;

伙计,这听起来不错,但整个“编译器不够聪明,无法注意到”的事情可能需要一些澄清。编译器怎么会没有注意到两种值类型之间的差异?@Mike:嗯,当您对属性使用Inflate()方法时,它不会生成错误。副本会膨胀,但不会分配给任何对象。这在技术上是有效的,充气方法可能有有用的副作用。虽然不是。编译器不知道它没有有用的副作用。我明白了。。。我想我运气不好,因为我没有注意到利润率对最终产品有任何影响。谢谢您的详细回答。@Brandi,PaperSize也包括在内,您正在更改默认设置