2010-03-08 20 views
5

Pre .net Estaba usando MFC, ON_UPDATE_COMMAND_UI y la clase CCmdUI para actualizar el estado de mi IU de Windows. De la referencia anterior de MFC/Win32:Actualización de objetos de IU en formularios de Windows

Normalmente, los elementos del menú y los botones de la barra de herramientas tienen más de un estado. Para el ejemplo , un elemento del menú aparece gris (atenuado) si no está disponible en el contexto actual . Los elementos del menú también pueden marcar marcar o desmarcar. El botón de la barra de herramientas también se puede deshabilitar si no está disponible, o se puede marcar.

¿Quién actualiza el estado de estos elementos a medida que cambian las condiciones del programa? Lógicamente, si un elemento de menú genera un comando manejado por, por ejemplo, un documento , tiene sentido que el documento actualice el elemento del menú. El documento probablemente contiene la información en la que se basa la actualización .

Si un comando tiene múltiples objetos de interfaz de usuario (tal vez un elemento de menú y un botón de la barra de herramientas), ambos son encaminado a la misma función de controlador. Esto encapsula el código de actualización de la interfaz de usuario para todos los objetos de interfaz de usuario equivalentes en un solo lugar .

El marco proporciona una interfaz conveniente para actualizar automáticamente objetos de interfaz de usuario. Puede elegir para realizar la actualización de alguna otra forma, pero la interfaz proporcionada es eficiente y fácil de usar.

¿Cuál es la guía para .net Windows Forms? Estoy usando un controlador Application.Idle en el formulario principal, pero no estoy seguro de que esta sea la mejor manera de hacerlo. En el momento en que puse todas las actualizaciones de UI en el controlador de eventos de Idle, mi aplicación comenzó a mostrar algunos problemas de rendimiento y todavía no tengo las métricas para rastrear esto. No estoy seguro de si está relacionado.

+0

¿Qué es exactamente estás tratando de hacer de nuevo? ¿Estás tratando de deshabilitar los controles en las aplicaciones de WinForms? –

+0

Desactivar/habilitar botones de la barra de herramientas, elementos de menú, etc. Marque/desmarque el estado de los botones de verificación en la barra de herramientas, elementos de menú que muestran un estado de verificación. Esa clase de cosas. Cosas muy rutinarias –

+2

Sí, Application.Idle. Cómo puede tener un problema de rendimiento cuando la aplicación está inactiva es misterioso. –

Respuesta

1

He encontrado que es más fácil tener el controlador de eventos del elemento de menú engendrar un hilo de fondo que deshabilita el elemento de menú, hace el trabajo, y luego vuelve a habilitar el elemento del menú. De esta forma, la IU está disponible para manejar otras solicitudes de UI, y no necesito sondear para cuando se complete la operación.

Normalmente incluyo lógica que evita que ocurran más de una operación que utiliza los mismos recursos simultáneamente. Esto significa crear una función para desactivar/habilitar todos los recursos similares a la vez. p.ej. Es posible que solo permita que ocurra 1 operación de archivo a la vez, así que crearía una función para deshabilitar/habilitar todos los elementos de menú asociados con las operaciones de archivo y llamarlo desde cada uno de esos elementos del menú.

0

Simplemente cambie su propiedad, p.

obj.Enabled = true; 

o

obj.Enabled = false; 

La propiedad de ese objeto llamará automáticamente a .Invalidate() o .Refresh() para usted, por lo que el control debe ser repintado automáticamente.

Si desea realizar una GRAN tarea que bloquearía la IU durante varios segundos, vale la pena usar Threads + Delegates.

+0

Eso es lo que hago ahora en el controlador Application.Idle en el formulario principal. Estoy tratando de descubrir cómo y dónde están haciendo esto los demás. No puedo usar el enlace de datos ya que los menús devexpress y las barras de herramientas que uso no ofrecen enlace de datos para esto. –

+0

bueno, esto significaría explotar el Application.Idle-handler para formularios más grandes. no deberías hacer esto solo hazlo cuando sea necesario. por ejemplo: agregar un evento onclick a un botón. en su controlador, desactive otro control. no pongas esto en application.idle. –

1

AFAIK, en el mundo estándar .NET System.Windows.Forms, esta funcionalidad no está disponible fuera de la caja. Este problema se puede responder de varias maneras. Los siguientes enlaces son recursos útiles:

OnUpdate equivalent

ActionLists for Windows forms

Command UI Updating Windows Forms in C#

+1

Vi algunos de estos enlaces antes y tengo mi propia implementación del patrón de comando. Todo lo que estos chicos están haciendo es usar el evento Application.Idle para la actualización. Supongo que eso es todo. La antigua forma C++ MFC era bastante buena, sin embargo. –

Cuestiones relacionadas