2010-04-07 42 views
4

我與PageSettings.PrintableArea的寬度和高度值有問題。 「寬度」,「高度」和「大小」屬性聲稱「獲取或設置」值。此外,inflate()函數聲稱根據傳入的值更改大小。C#中的PrintableArea - Bug?

但是,所有這些嘗試更改值都未奏效。 Inflate()忽略(沒有錯誤,只是通過就好像它的工作,但值保持不變。

試圖設置高度,寬度或大小給出的編譯器錯誤:「無法修改'系統的返回值.Drawing.Printing.PageSettings.PrintableArea」,因爲它不是一個變量」。

給我的感覺,這意味着‘或說明的設置’部分是一個謊言。

爲什麼我想知道這:(有人總是問......)我有一個打印應用程序(C#,WinForm),大多數情況下工作得很好,我可以設置打印機設置和頁面設置對象來控制打印對話框的打印機屬性中顯示的內容。然而,與Microsoft Office Document Image Writer一起,這些設置有時會被忽略,並且紙張大小即使在顯示其他內容時也會返回爲0,0。我所希望的只是所顯示的值都是所見即所得,所以我將紙張大小更改爲原來的大小,但可打印區域(如果出錯)會使得圖像不穩定。生成的圖像是可打印區域的大小,而不是紙張大小的值。只是想知道是否有這個原因或一種方法讓它不這樣做。

在此先感謝。 :)

UPDATE:

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

對於我的(自定義大小)正確打印的打印機,當我改變了紙張大小的PrintableArea和PageBounds自動更改爲匹配。當我在MDIW上更改PaperSize時,只有PageBounds發生變化。我不明白是什麼原因造成的。

結論:

Nobugz做了一項偉大的工作,解釋爲什麼PrintableArea不能設置(和通常會永遠不需要)和爲什麼它的充氣()函數將被忽略,所以我標誌着作爲答案。

就促使我問這個問題的持續性問題而言,我仍然處於虧損狀態。爲了響應'ScaleTranform'建議,PaperSize和Graphics對象已經具有正確的值,因此與這些值混合可能不會有幫助。我懷疑我可以沿着這條路線做的最多的事情是將我正確大小的圖像調整爲我得到的PrintableArea的垃圾值。當我明確設置PaperSize無法相應地修改PrintableArea時,我將假定它是與bug相關的行爲。

令人沮喪的是,我似乎是唯一一個遇到過這個問題的人。至少,到目前爲止,我只觀察了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(); 
} 

回答

6

這是.NET編程相當根本的問題,每一個程序員下降至少一次吧。 PrintableArea屬性類型是RectangleF。這是一種結構,一種價值類型。當您使用該物業時,您會收到一個副本的值。

編譯器會注意到您正在嘗試修改副本的成員,例如當您嘗試指定Height屬性時。但是當你使用Inflate()方法時,它會變得麻木。您正在對副本進行膨脹,而不是原始值,編譯器不夠聰明,無法注意。

這裏的關鍵問題是PrintableArea屬性只有一個getter,它沒有setter。這意味着你不能改變它。如果你仔細想想,這是有道理的,你不能改變紙張的大小,也不能改變打印機的設計。您可能想要使用邊距屬性。

+0

男人,這聽起來不錯,但整個「編譯器不夠聰明,注意到」的事情可能會使用一些澄清。編譯器如何不注意兩個值類型之間的差異? – 2010-04-07 21:08:02

+0

@Mike:好的,在屬性上使用Inflate()方法時不會產生錯誤。副本被誇大了,但沒有分配給任何東西。這在技術上是有效的,膨脹方法可能有有用的副作用。雖然沒有。編譯器不知道它沒有有用的副作用。 – 2010-04-07 21:22:18

+0

我明白了......我猜測我運氣不好,因爲我沒有注意到毛利在最終產品上有所改變。感謝您的詳細解答。 – Brandi 2010-04-07 21:47:59

0

我最近能夠爲自己弄明白這一點。 分配新紙張尺寸時: A)必須指定「自定義」 B)紙張尺寸有限制。我還沒有弄清楚它們,它們可能取決於打印機。如果大小無效,則可打印區域將成爲默認的8.5x11。這可能是他們必須是10

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

倍數不起作用:

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

我們,如果你發現什麼了我。

1

好吧,我知道這是有點舊,所以appologies,但我有同樣的問題,並找出如何正確設置紙張大小,以便PrintableArea是正確的,因爲這是少數職位之一當我'搜索'出現這個問題時,我想我會補充我是如何在這裏工作的,所以下一個絆倒這個人的人得到了答案。

設置紙張尺寸=新紙張尺寸(...)時,即使您將其命名爲「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;