2009-12-09 6 views
7

Моя проблема в том, что я создал расширенный элемент управления RichTextBox, который использует собственный API для добавления многих функций RichEdit, отсутствующих в стандартном элементе управления (т. Е. Изменение свойства одного шрифта на выбор w/o изменение других свойств шрифта, перенос слов на принтер [например, WordPad] и т. д.). В рамках элемента управления я выставляю PrintDocument, который используется для печати форматированного содержимого RichTextBox. Когда wordwrap установлен на «Wrap To Printer», я отправляю сообщение EM_SETTARGETDEVICE в RichTextBox и заставляю его обертывать соответствующую длину.C# PrintDocument Изменено событие

Все это прекрасно работает, когда что-то (пользователь/код) изменяет свойство WordWrap моего элемента управления. Однако, если PrintDocument изменен после этого, я не знаю, как это узнать. Таким образом, хотя пользователь, возможно, изменил поля в PrintDocument, мой RichTextBoxEx не перенаправляет EM_SETTARGETDEVICE для новой ширины до тех пор, пока свойство WordWrap не будет изменено.

Я вижу несколько вариантов преодоления этого, но я не большой поклонник любого из них. Вот что у меня есть:

  1. Добавить метод в UpdatePrintDocument() или похожую, что нужно было бы назвать после того, как нечто внешнее от контроля (то есть: а PageSetupDialog на родительской форме) обновлены настройки в PrintDocument. Минусы: я буду распределять контроль, поэтому я хотел бы сделать его максимально дружелюбным. Хотя я, возможно, помню, чтобы вызвать метод в любое время, когда я успешно обновляю параметры PrintDocument, кто-то еще может этого не сделать. Pro: Это просто реализовать.

  2. Создайте новый класс PrintDocumentEx, который основан на PrintDocument и реализует необходимые события «Изменены». Минусы: может быть недостаточно, возможно, потребуется создать PrintSettingsEx, PageSettingsEx и т. Д. Pro. Реализуйте один раз, и никто не должен снова об этом беспокоиться.

Я действительно думаю, # 2 является вариантом я собираюсь должен пойти с, но это не очень многоразовыми для следующего экземпляра мне нужно немного похожей функциональности. Я предполагаю, что то, что я ищу, - это способ привязать «общее событие PropertyChanged» к любому существующему классу, поскольку это применимо в будущих ситуациях. Тревожно видеть, что вы, ребята, имеете для меня :-)

+0

Время имеет значение, поэтому я пошел дальше и начал внедрять PrintDocumentEx. Поскольку я ожидал, что диалоги печати WinForms не будут создавать новые параметры PageSettings, PrinterSettings и т. Д., Но изменят существующие свойства, поэтому мне нужно будет создавать классы «Ex» для всех объектов и вызывать событие «Изменено» для каждого свойства листа обратно в PrintDocumentEx , Это неприятно, но его прогресс. Все еще хотелось узнать, есть ли более общее решение, которое мне не хватает. –

+0

Просто после того, как мой класс PrintDocumentEx (и связанный) не работал.Изучая PrintDialog и связанные с ним элементы управления, это потому, что они используют собственные методы для фактического обновления PrintDocument. Таким образом, события, которые я привязал к свойствам в моих классах «Ex», никогда не запускались, потому что не был вызван элемент доступа. Пока я пошел с методом UpdatePrintDocument(), но я все еще ищу лучшее решение. –

+0

Интересно, что я могу сделать бесполезный вопрос (тот, у кого была щедрость с неприемлемым ответом) в сообществе wiki. –

ответ

1

Просто после того, как мой класс PrintDocumentEx (и связанный) не работал. Изучая PrintDialog и связанные с ним элементы управления, это потому, что они используют собственные методы для фактического обновления PrintDocument. Таким образом, события, которые я привязал к свойствам в моих классах «Ex», никогда не запускались, потому что не был вызван элемент доступа.

+0

Да, вы сделали: «Создание баунти из 100 человек по вопросу id = 1871103 15 дек в 4: 49' –

1

Если я правильно понял ваш вопрос, информация, которая вам требуется, отправляется при изменении свойства WordWrap.

Когда другие вещи изменены, ни одно событие не обновляет документ печати. При следующем изменении свойства WordWrap вся информация будет отправлена.

Исправить это, чтобы изменить свойство WordWrap, когда вы изменяете свойство, которое вы хотите отправить в документ печати. Измените его на временное значение, затем измените его снова.

Смежные вопросы