2011-05-03 13 views
7

Estoy tratando de implementar un sistema de punta de herramienta en una aplicación WPF MVVM. Se supone que la información sobre herramientas aparece en una determinada etiqueta que es una parte de la ventana principal (que no se ubica en el puntero del mouse) y debe pasar al pasar el mouse (idealmente con un retraso configurable, pero eso no es importante), llamar a un método en el ViewModel apropiado. El ViewModel se ocupará entonces de ponerse en contacto con la capa del Modelo que resolverá qué información sobre herramientas mostrar, etc.¿En evento de mouse en WPF?

Mi problema es cómo obtener un evento de pasar el mouse desde la vista al ViewModel, junto con la identidad del objeto que disparó el evento (para que pueda resolver el truco de herramientas correcto para él). Digamos que tengo un <Label Name="MyLabel" Content="This is a label" /> en mi SettingsView.xaml, ¿cómo hago para llamar al método GetTooltip(string id) en SettingsViewModel con MyLabel como argumento (o accesible de otra manera) al pasar el mouse? ¿Puedo usar un <Trigger> normal para hacerlo de alguna manera?

+2

Echa un vistazo a este enlace para ver si la creación de Comandos y la vinculación a ellos en controles normalmente "No ordenados" podrían resolver tu problema. http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/04/14/wpf-commands-everywhere.aspx –

+0

@Dave: Esta debería ser una respuesta. Me gustaría votarlo =) – Jens

+0

@Jens - Todo listo. También he agregado un poco. Gracias por la sugerencia. –

Respuesta

1

En primer lugar, ¿ha probado el control incorporado ToolTip? Puede darle lo que necesita de forma gratuita, y puede ser diseñado/modelado para alojar contenido complejo.

En segundo lugar, es posible que pueda utilizar el evento MouseEnter disponible en cada control WPF. Sin embargo, debería adjuntar su controlador a los controles que desea admitir.

Con el fin de cubrir de forma genérica todos los controles, acompañar un controlador a la PreviewMouseMove caso de los padres Window 's (o anular OnPreviewMouseMove de código subyacente de la ventana), que se llamará cuando cualquier elemento hijo está a punto de recibir una. A continuación, puede averiguar qué control se encuentra debajo del puntero del mouse usando HitTest. Sin embargo, esto no es muy eficiente, por lo que puede estar mejor con el control ToolTip incorporado.

+0

Podría usar 'ToolTip', sí, pero como dije, no quiero que el texto aparezca en el puntero del mouse, quiero que aparezca en un área en la parte inferior de la ventana principal. MouseEnter podría funcionar (solo tendría que tener un evento separado para borrar la información sobre herramientas en MouseLeave, supongo).Examinaré el resto de tu respuesta mejor mañana - la idea de cobertura genérica suena bien, supuse que tendría que poner un evento en cada control que quisiera con una información sobre herramientas, pero si esto funciona, podría no ser necesario. ¡Gracias por ahora! – Swooper

0

Crea un control Popup con un TextBlock anidado en tu plantilla de control (crea un estilo para la etiqueta), vincula su propiedad visibility a IsMouseOver y vincula el PlacementTarget al control en la parte inferior de la ventana donde quieras a aparecer. Finetune con propiedades de desplazamiento horizontal/vertical.

2

Lo que necesita hacer es conectar algunos comandos (el enfoque preferido para ViewModels para interactuar con eventos en la Vista) a los eventos del mouse y luego "poblar" su control "información sobre herramientas" con la información adecuada.

Por ejemplo, su ViewModel tiene una propiedad ToolTip (que representa un solo sentido, obtener solo ToolTipViewModel) que se puede vincular a un área de su UI (con una plantilla de datos). Vinculará el nuevo comando "MouseOver" y rellenará/anulará el objeto que se encuentra en su propiedad ToolTipViewModel según los comandos. Esto permite la capacidad de prueba, el código cero detrás y el uso de plantillas de datos para construir su presentación de información sobre herramientas.

Check out this link para ver si se construyen Los comandos y la vinculación a ellos en controles normalmente "No ordenados" podrían resolver su problema.

Cuestiones relacionadas