我的问题是我创建了一个“扩展”RichTextBox 控件,该控件使用本机 API 添加标准控件中缺少的许多 RichEdit 功能(即:修改选择中的单个字体属性而不更改其他字体属性,自动换行到打印机 [如 WordPad] 等)。作为控件的一部分,我公开了一个 PrintDocument,用于打印 RichTextBox 的格式化内容。当 wordwrap 设置为“Wrap To Printer”时,我将 EM_SETTARGETDEVICE 消息发送到 RichTextBox 并使其换行到适当的长度。
当某些东西(用户/代码)更改我的控件的 WordWrap 属性时,这一切都可以正常工作。但是,如果在那之后修改了 PrintDocument,我就无法知道了。因此,即使用户可能更改了 PrintDocument 上的边距,我的 RichTextBoxEx 也不会重新发送新宽度的 EM_SETTARGETDEVICE,直到 WordWrap 属性发生更改。
我看到了一些克服这个问题的选择,但我不是其中任何一个的忠实粉丝。这是我所拥有的:
添加一个 UpdatePrintDocument() 方法或类似的方法,在控件的外部内容(即:父窗体上的 PageSetupDialog)更新 PrintDocument 中的设置后需要调用该方法。缺点:我将分发控件,所以我想让它尽可能友好。虽然我可能记得在成功更新其他人可能不会的 PrintDocument 设置时调用该方法。优点:实现起来很简单。
创建一个新的 PrintDocumentEx 类,该类基于 PrintDocument 并实现所需的“已更改”事件。缺点:可能还不够,可能需要创建 PrintSettingsEx、PageSettingsEx 等。优点:实施一次,无需再担心。
我真的认为#2是我将不得不使用的选项,但对于下一个我需要一些类似功能的实例来说,它不是很可重用。我想我正在寻找一种将“通用 PropertyChanged 事件”附加到任何现有类属性的方法,因为这将适用于未来的情况。很想看看你们对我有什么:-)