2009-12-09 66 views
7

我的问题是,我创建了一个“扩展”RichTextBox控件,它使用本机API添加许多从标准控件中缺少的RichEdit功能(即:修改选择上的单个字体属性w/o更改其他字体属性,将文字换行到打印机[如写字板]等)。作为控件的一部分,我公开了一个PrintDocument,用于打印RichTextBox的格式化内容。当wordwrap设置为“Wrap To Printer”时,我将Message_SourceTemplate设置为发送消息给RichTextBox,并使其包装为适当的长度。C#PrintDocument更改事件

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

我看到一些选择来克服这一点,但我不是他们中的任何一个的大粉丝。下面是我有:

  1. 添加UpdatePrintDocument()方法或similiar将需要被调用从控制外在的东西后(即:一个PageSetupDialog父窗体上)更新了PrintDocument的设置。缺点:我会分发控件,所以我想尽可能地让它变得友好。虽然我可能记得随时调用方法,我成功更新其他人可能不会打印的PrintDocument设置。 Pro:实现起来很简单。

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

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

+0

时间是问题所在,我继续开始实施PrintDocumentEx。正如我预期的WinForms打印对话框不会创建新的PageSettings,PrinterSettings等,但修改现有的属性,所以我需要为所有对象创建“Ex”类,并将每个叶属性的“更改”事件泡泡回到PrintDocumentEx 。这是讨厌的,但它的进展。仍然急于看看我是否缺少更通用的解决方案。 – 2009-12-09 02:36:40

+0

只是跟进我的PrintDocumentEx(和关联)分类不起作用。查看PrintDialog和相关控件,这是因为它们使用本地方法来实际更新PrintDocument。所以我附加到我的“Ex”类中的属性的事件从未激发,因为set访问器从未被调用过。现在我使用UpdatePrintDocument()方法,但仍在寻找更好的解决方案。 – 2009-12-13 13:54:37

+0

有趣的是,我可以做一个无用的问题(一个有未被接受的答案的赏金)社区维基文章。 – 2010-03-03 02:14:40

回答

1

只是跟进我的PrintDocumentEx(和关联)分类不起作用。查看PrintDialog和相关控件,这是因为它们使用本地方法来实际更新PrintDocument。所以我附加到我的“Ex”类中的属性的事件从未激发,因为set访问器从未被调用过。

+0

是的,你做了:'赏金创建100个代表问题id = 1871103 12月15日在4:49' – 2010-02-07 09:15:44

1

如果我已经正确理解您的问题,当WordWrap属性发生变化时,您需要的信息将被发送。

当其他事情改变时,没有事件更新打印文档。下次WordWrap属性更改时,将发送所有信息。

无论何时更改要发送到打印文档的属性,解决此问题的方法都是随即更改WordWrap属性。将其更改为临时值,然后再将其更改回来。