Моя проблема в том, что я создал расширенный элемент управления RichTextBox, который использует собственный API для добавления многих функций RichEdit, отсутствующих в стандартном элементе управления (т. Е. Изменение свойства одного шрифта на выбор w/o изменение других свойств шрифта, перенос слов на принтер [например, WordPad] и т. д.). В рамках элемента управления я выставляю PrintDocument, который используется для печати форматированного содержимого RichTextBox. Когда wordwrap установлен на «Wrap To Printer», я отправляю сообщение EM_SETTARGETDEVICE в RichTextBox и заставляю его обертывать соответствующую длину.C# PrintDocument Изменено событие
Все это прекрасно работает, когда что-то (пользователь/код) изменяет свойство WordWrap моего элемента управления. Однако, если PrintDocument изменен после этого, я не знаю, как это узнать. Таким образом, хотя пользователь, возможно, изменил поля в PrintDocument, мой RichTextBoxEx не перенаправляет EM_SETTARGETDEVICE для новой ширины до тех пор, пока свойство WordWrap не будет изменено.
Я вижу несколько вариантов преодоления этого, но я не большой поклонник любого из них. Вот что у меня есть:
Добавить метод в UpdatePrintDocument() или похожую, что нужно было бы назвать после того, как нечто внешнее от контроля (то есть: а PageSetupDialog на родительской форме) обновлены настройки в PrintDocument. Минусы: я буду распределять контроль, поэтому я хотел бы сделать его максимально дружелюбным. Хотя я, возможно, помню, чтобы вызвать метод в любое время, когда я успешно обновляю параметры PrintDocument, кто-то еще может этого не сделать. Pro: Это просто реализовать.
Создайте новый класс PrintDocumentEx, который основан на PrintDocument и реализует необходимые события «Изменены». Минусы: может быть недостаточно, возможно, потребуется создать PrintSettingsEx, PageSettingsEx и т. Д. Pro. Реализуйте один раз, и никто не должен снова об этом беспокоиться.
Я действительно думаю, # 2 является вариантом я собираюсь должен пойти с, но это не очень многоразовыми для следующего экземпляра мне нужно немного похожей функциональности. Я предполагаю, что то, что я ищу, - это способ привязать «общее событие PropertyChanged» к любому существующему классу, поскольку это применимо в будущих ситуациях. Тревожно видеть, что вы, ребята, имеете для меня :-)
Время имеет значение, поэтому я пошел дальше и начал внедрять PrintDocumentEx. Поскольку я ожидал, что диалоги печати WinForms не будут создавать новые параметры PageSettings, PrinterSettings и т. Д., Но изменят существующие свойства, поэтому мне нужно будет создавать классы «Ex» для всех объектов и вызывать событие «Изменено» для каждого свойства листа обратно в PrintDocumentEx , Это неприятно, но его прогресс. Все еще хотелось узнать, есть ли более общее решение, которое мне не хватает. –
Просто после того, как мой класс PrintDocumentEx (и связанный) не работал.Изучая PrintDialog и связанные с ним элементы управления, это потому, что они используют собственные методы для фактического обновления PrintDocument. Таким образом, события, которые я привязал к свойствам в моих классах «Ex», никогда не запускались, потому что не был вызван элемент доступа. Пока я пошел с методом UpdatePrintDocument(), но я все еще ищу лучшее решение. –
Интересно, что я могу сделать бесполезный вопрос (тот, у кого была щедрость с неприемлемым ответом) в сообществе wiki. –