- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对 PageSettings.PrintableArea 的宽度和高度值有疑问。 Width、Height 和 Size 属性声称“获取或设置”这些值。此外,inflate() 函数声称会根据传入的值更改大小。
但是,所有这些更改值的尝试都没有奏效。 Inflate() 被忽略(没有错误,就像它工作一样通过,但值保持不变。
尝试设置高度、宽度或大小会产生编译器错误:“无法修改‘System.Drawing.Printing.PageSettings.PrintableArea’的返回值,因为它不是变量”。
我觉得这意味着描述中的“或集合”部分是谎言。
为什么我想知道这个:(总是有人问...)我有一个打印应用程序(C#、WinForm),它在大多数情况下都运行良好。我可以设置打印机设置和页面设置对象来控制打印对话框的打印机属性中显示的内容。但是,使用 Microsoft Office Document Image Writer 时,这些设置有时会被忽略,即使显示其他内容,纸张大小也会返回 0、0。就显示值而言,我真正希望它是所见即所得的,所以我将纸张大小改回应有的大小,但可打印区域如果错误,会使生成的图像不稳定。生成的图像是可打印区域的大小,而不是 papersize 中的值。只是想知道是否有这样做的原因或让它不这样做的方法。
提前致谢。 :)
更新:
//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();
}
最佳答案
这是 .NET 编程的一个非常基本的问题,每个程序员都至少被它绊倒过一次。 PrintableArea 属性类型是 RectangleF。那是一个结构,一个值类型。当您使用该属性时,您会取回该值的副本。
编译器会注意到您正在尝试修改副本的成员,例如当您尝试分配 Height 属性时。但是当您使用 Inflate() 方法时,它会变得很容易。您正在膨胀副本,而不是原始值,并且编译器不够聪明,无法注意到。
这里的关键问题是 PrintableArea 属性只有一个 getter,没有 setter。这意味着您无法更改它。如果你仔细想想,这是有道理的,你不能改变纸张的尺寸,也不能改变打印机的设计。您可能想要使用边距属性。
关于c# - C# 中的 PrintableArea - 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595610/
我对 PageSettings.PrintableArea 的宽度和高度值有疑问。 Width、Height 和 Size 属性声称“获取或设置”这些值。此外,inflate() 函数声称会根据传入的
我是一名优秀的程序员,十分优秀!