私の問題は、ネイティブ API を使用して、標準コントロールにはない多くの RichEdit 機能を追加する「拡張」RichTextBox コントロールを作成したことです (つまり、他のフォント プロパティを変更せずに、選択範囲の単一のフォント プロパティを変更し、 [ワードパッドのような] プリンターへのワードラップなど)。コントロールの一部として、RichTextBox の書式設定されたコンテンツを印刷するために使用される PrintDocument を公開します。wordwrap が "Wrap To Printer" に設定されている場合、EM_SETTARGETDEVICE メッセージを RichTextBox に SendMessage し、適切な長さに折り返すようにします。
何か (ユーザー/コード) がコントロールの WordWrap プロパティを変更すると、これはすべて正常に機能します。ただし、その後 PrintDocument が変更された場合、それを知る方法はありません。したがって、ユーザーが PrintDocument の余白を変更した可能性がある場合でも、WordWrap プロパティが変更されるまで、RichTextBoxEx は新しい幅の EM_SETTARGETDEVICE を再送信しません。
これを克服するためのいくつかのオプションがありますが、私はそれらのどれも大ファンではありません. ここに私が持っているものがあります:
UpdatePrintDocument() メソッドを追加するか、コントロールの外部の何か (つまり、親フォームの PageSetupDialog) が PrintDocument の設定を更新した後に呼び出す必要がある類似のメソッドを追加します。短所: コントロールを配布するので、できるだけ使いやすくしたいと思います。私はいつでもメソッドを呼び出すことを覚えているかもしれませんが、他の誰かがそうしないかもしれない PrintDocument 設定を正常に更新します。長所: 実装は簡単です。
PrintDocument を基にして、必要な "Changed" イベントを実装する新しい PrintDocumentEx クラスを作成します。短所: 十分ではない可能性があり、PrintSettingsEx、PageSettingsEx などを作成する必要がある場合があります. 長所: 一度実装すれば、誰もそれについて心配する必要はありません。
#2は私が使用しなければならないオプションだと本当に思いますが、同様の機能が必要な次のインスタンスではあまり再利用できません. 私が探しているのは、「ジェネリック PropertyChanged イベント」を既存のクラス プロパティにアタッチする方法だと思います。これは、将来の状況で適用できるからです。皆さんが私のために持っているものを見るのが心配です:-)