8

我的问题是我创建了一个“扩展”RichTextBox 控件,该控件使用本机 API 添加标准控件中缺少的许多 RichEdit 功能(即:修改选择中的单个字体属性而不更改其他字体属性,自动换行到打印机 [如 WordPad] 等)。作为控件的一部分,我公开了一个 PrintDocument,用于打印 RichTextBox 的格式化内容。当 wordwrap 设置为“Wrap To Printer”时,我将 EM_SETTARGETDEVICE 消息发送到 RichTextBox 并使其换行到适当的长度。

当某些东西(用户/代码)更改我的控件的 WordWrap 属性时,这一切都可以正常工作。但是,如果在那之后修改了 PrintDocument,我就无法知道了。因此,即使用户可能更改了 PrintDocument 上的边距,我的 RichTextBoxEx 也不会重新发送新宽度的 EM_SETTARGETDEVICE,直到 WordWrap 属性发生更改。

我看到了一些克服这个问题的选择,但我不是其中任何一个的忠实粉丝。这是我所拥有的:

  1. 添加一个 UpdatePrintDocument() 方法或类似的方法,在控件的外部内容(即:父窗体上的 PageSetupDialog)更新 PrintDocument 中的设置后需要调用该方法。缺点:我将分发控件,所以我想让它尽可能友好。虽然我可能记得在成功更新其他人可能不会的 PrintDocument 设置时调用该方法。优点:实现起来很简单。

  2. 创建一个新的 PrintDocumentEx 类,该类基于 PrintDocument 并实现所需的“已更改”事件。缺点:可能还不够,可能需要创建 PrintSettingsEx、PageSettingsEx 等。优点:实施一次,无需再担心。

我真的认为#2是我将不得不使用的选项,但对于下一个我需要一些类似功能的实例来说,它不是很可重用。我想我正在寻找一种将“通用 PropertyChanged 事件”附加到任何现有类属性的方法,因为这将适用于未来的情况。很想看看你们对我有什么:-)

4

2 回答 2

1

如果我正确理解了您的问题,您需要的信息会在 WordWrap 属性更改时发送。

当其他事情发生变化时,不会有任何事件更新打印文档。下次更改 WordWrap 属性时会发送所有信息。

解决此问题的黑客方法是更改​​ WordWrap 属性,每当您更改要发送到打印文档的属性时。将其更改为临时值,然后再次更改回来。

于 2009-12-20T20:29:37.940 回答
1

Just following up that my PrintDocumentEx (and associated) classed didn't work. Looking into the PrintDialog and related controls it's because they use native methods to acctually update the PrintDocument. So the events I attached to the properties in my "Ex" classes never fired because the set accessor was never invoked.

于 2010-02-06T21:33:26.097 回答