2009-12-09 17 views
7

Mi problema es que he creado un control RichTextBox "extendido" que usa API nativa para agregar muchas características RichEdit que faltan del control estándar (es decir: modificar una propiedad de fuente única en una selección w/o cambiar las otras propiedades de fuente, ajuste de texto a una impresora [como WordPad], etc.). Como parte del control expongo un PrintDocument que se utiliza para imprimir los contenidos formateados de RichTextBox. Cuando wordwrap está configurado en "Ajustar a la impresora", yo envío el mensaje EM_SETTARGETDEVICE al RichTextBox y hago que se ajuste a la longitud adecuada.C# PrintDocument Evento cambiado

Todo funciona bien cuando algo (usuario/código) cambia la propiedad de WordWrap de mi control. Sin embargo, si PrintDocument se modifica después de eso, no tengo forma de saberlo. Entonces, aunque el usuario puede haber cambiado los márgenes en el PrintDocument, mi RichTextBoxEx no reenvía el EM_SETTARGETDEVICE para el nuevo ancho hasta que se cambie la propiedad de WordWrap.

Veo algunas opciones para superar esto, pero no soy un gran admirador de ninguno de ellos. Aquí es lo que tengo:

  1. Añadir un método o similar que tendría que ser llamado UpdatePrintDocument() después de algo externo del control (es decir: un PageSetupDialog en la forma parental) ha actualizado la configuración de la PrintDocument. Contras: Distribuiré el control así que me gustaría hacerlo lo más amigable posible. Aunque recuerdo llamar al método cada vez que actualizo correctamente la configuración de PrintDocument, es posible que alguien no lo haga. Pro: es simple de implementar.

  2. Cree una nueva clase PrintDocumentEx que se base en PrintDocument e implemente los eventos necesarios "Modificados". Contras: Puede que no sea suficiente, podría necesitar crear PrintSettingsEx, PageSettingsEx, etc. Pro: Implementar una vez y nadie tiene que preocuparse por ello nuevamente.

Realmente pienso # 2 es la opción que voy a tener que ir con pero no es muy reutilizable para la siguiente instancia necesito algo de funcionalidad similar. Creo que lo que estoy buscando es una forma de adjuntar un "evento genérico PropertyChanged" a cualquier propiedad de clases existente, ya que esto sería aplicable en situaciones futuras. Ansioso por ver lo que ustedes tienen para mí :-)

+0

El tiempo es el problema, así que seguí adelante y comencé a implementar PrintDocumentEx. Como esperaba, los cuadros de diálogo de impresión de WinForms no crean nuevas configuraciones de página, configuración de impresora, etc., pero modifican las propiedades existentes, así que tendré que crear clases "Ex" para todos los objetos y pasar el evento "Cambiado" para cada propiedad de hoja de nuevo a PrintDocumentEx . Es desagradable pero su progreso. Todavía estoy ansioso por ver si hay una solución más genérica que me falta. –

+0

Solo haciendo un seguimiento de que mi PrintDocumentEx (y asociada) clasificada no funcionó.Examinando el PrintDialog y los controles relacionados es porque usan métodos nativos para actualizar de forma efectiva el PrintDocument. Por lo tanto, los eventos que adjunté a las propiedades de mis clases "Ex" nunca se activaron porque nunca se invocó el acceso del conjunto. Por ahora fui con el método UpdatePrintDocument() pero aún estoy buscando una mejor solución. –

+0

Interesante que puedo hacer una pregunta inútil (una que tuvo una recompensa con una respuesta no aceptada) una publicación wiki de la comunidad. –

Respuesta

1

Simplemente haciendo un seguimiento de que mi PrintDocumentEx (y asociada) clasificada no funcionó. Examinando el PrintDialog y los controles relacionados es porque usan métodos nativos para actualizar de forma efectiva el PrintDocument. Por lo tanto, los eventos que adjunté a las propiedades de mis clases "Ex" nunca se activaron porque nunca se invocó el acceso del conjunto.

+0

Sí, lo hiciste: 'Creación de Bounty de 100 rep en id de pregunta = 1871103 15 de diciembre a las 4: 49' –

1

Si he entendido bien su pregunta, la información que necesita se envía cuando se cambia la propiedad WordWrap.

Cuando se modifican otras cosas, no hay eventos que actualicen el Documento de impresión. La próxima vez que se cambie la propiedad WordWrap, se enviará toda la información.

La forma de solucionar esto es cambiar la propiedad de WordWrap, siempre que cambie una propiedad que desea enviar al Documento de Impresión. Cámbielo a un valor temporal, luego cámbielo de nuevo.

Cuestiones relacionadas