Вопрос

Моя проблема в том, что я создал "расширенный" элемент управления RichTextBox, который использует собственный API для добавления многих функций RichEdit, отсутствующих в стандартном элементе управления (ie:изменение одного свойства шрифта при выделении без изменения других свойств шрифта, перенос текста на принтер [например, WordPad] и т.д.).Как часть элемента управления я предоставляю PrintDocument, который используется для печати форматированного содержимого RichTextBox.Когда для wordwrap установлено значение "Перенос на принтер", я отправляю сообщение EM_SETTARGETDEVICE в RichTextBox и заставляю его переноситься до соответствующей длины.

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

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

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

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

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

Это было полезно?

Решение 2

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top