PrintableArea в C# - ошибка?

У меня есть проблема с PageSettings. Значения ширины и высоты PrintableArea. Ширина, Высота и свойства Size утверждают, что "получили или установили" значения. Кроме того, расширение () функция утверждает, что изменилась, размер на основе значений передал в.

Однако все эти попытки изменить значение не работали. Расширитесь (), игнорируют (никакая ошибка, просто передачи, как будто это работало, но значения остаются неизменными.

Пытание установить высоту, ширину или размер дает ошибку компилятора: "Не может изменить возвращаемое значение 'Системы. Рисование. Печать. PageSettings. PrintableArea', потому что это не переменная".

Я получаю чувство, что это означает, "или набор" часть описания является ложью.

Почему я хочу знать это: (Кто-то всегда спрашивает...), у меня есть приложение печати (C#, WinForm), который для большинства вещей работает скорее хорошо. Я могу установить параметры принтера, и настройки страницы возражает для управления что дисплеи в свойствах принтера диалогового окна печати. Однако с Устройством записи Изображения документов Microsoft Office, эти настройки иногда игнорируются, и возвраты формата бумаги как 0, 0, даже когда это отобразило что-то еще. Все я действительно хочу это, чтобы это был WYSIWYG до отображенных значений, идет, таким образом, я возвращаю формат бумаги к тому, каково это должно быть, но печатаемая область, если это неправильно, делает получающееся изображение wonky. Получающееся изображение является размером печатаемой области вместо значения в 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 изменяются автоматически для соответствия ему. Когда я изменяю PaperSize на MDIW, только изменение PageBounds. Я не понимаю то, что вызывает это.

ЗАКЛЮЧЕНИЕ:

Nobugz сделал отличную работу, объясняющую, почему PrintableArea не может быть установлен (и никогда не должен был бы обычно быть), и почему расширяющаяся () функция проигнорирована, таким образом, я отмечаю это как ответ.

До персистентной проблемы, которая предложила мне задавать этот вопрос, я все еще в недоумении. В ответ на предложение 'ScaleTranform' PaperSize и Графические объекты уже имеют правильные значения, таким образом смешивание с теми значениями, вероятно, не поможет. Я подозреваю большинство, которое я мог сделать вдоль того маршрута, изменяют размер моего правильно измеренного изображения к значениям мусора, которые я получаю для 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();
}
5
задан Brandi 8 April 2010 в 19:46
поделиться

2 ответа

Это довольно фундаментальная проблема программирования .NET, каждый программист хоть раз попадется на нее. Тип свойства PrintableArea - RectangleF. Это структура, тип значения. Когда вы используете свойство, вы получаете обратно копию значения.

Компилятор заметит, что вы пытаетесь изменить член копии, например, когда вы пытаетесь назначить свойство Height. Но когда вы используете метод Inflate (), это становится непонятным. Вы увеличиваете копию, а не исходное значение, и компилятор недостаточно умен, чтобы это заметить.

Ключевая проблема здесь в том, что свойство PrintableArea имеет только геттер, но не имеет сеттера. Это означает, что вы не можете его изменить. Что имеет смысл, если подумать, вы не можете изменить размер листа бумаги или изменить дизайн принтера. Вероятно, вы захотите использовать свойство Margins.

7
ответ дан 13 December 2019 в 22:04
поделиться

Недавно я смог сам в этом разобраться. При назначении нового размера бумаги: А) необходимо указать "Custom" Б) Существуют ограничения по размерам бумаги. Я не понял их, и они могут зависеть от принтера. Если у вас недопустимый размер, область печати становится размером по умолчанию 8,5x11. Возможно, они должны быть кратны 10.

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

не работает:

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

Дайте мне знать, если вы узнаете что-нибудь еще.

1
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: