2010-12-16 16 views
24

Tengo varios elementos de control de la GUI de los cuales se supone que algunos deben generar la misma acción (llamada de función de código subyacente) en la interacción del mouse (MouseEnter, MouseLeave).
[edit] Estoy realizando algunas funcionalidades no relacionadas con el estilo en mis controladores de eventos. atribuye
En este momento estoy usando evento en cada control:¿Cómo establecer una función de evento a través de un estilo?

<Button Name="Button" Content="Button 1" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    PreviewMouseDown="Button1_PreviewMouseDown" PreviewMouseUp="Button1_PreviewMouseUp" /> 
<Button Name="NotInteractingButton" Content="Button 2" 
    /><!-- this button has no MouseOver-effects --> 
<ToggleButton Content="ToggleButton" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" /> 
<!-- needs to use IsMouseDirectlyOver on the slider knob... --> 
<Slider Name="HorizontalSlider" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    ValueChanged="Slider_ValueChanged" /> 
<Slider Name="VerticalSlider" Orientation="Vertical" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    ValueChanged="Slider_ValueChanged" /> 

Dado que muchos controles en este ejemplo están llamando a las mismas dos funciones "GeneralMouseEnter" y "GeneralMouseLeave", me gustaría ser capaz de define un estilo o algo similar para encapsular ese comportamiento.

[editar - aclaración]
Esto se supone que se convertirá en un tipo de complemento más adelante.
(Incluir archivos de código y XAML a cualquier programa de interfaz gráfica de usuario y establecer un estilo para cada elemento interactivo de control ...)

Por lo que he encontrado en la web, que se puede utilizar EventTriggers como en este ejemplo:

<Style.Triggers> 
    <EventTrigger RoutedEvent="Click"> 
    <EventTrigger.Actions> 
     <BeginAction TargetName="SomeAction" /> 
    </EventTrigger.Actions> 
    </EventTrigger> 
</Style.Triggers> 

No sé si y cómo llamar a las funciones dentro de una acción.

  • ¿Es posible obtener esta funcionalidad creando un estilo con acción + disparador para aplicar a cada control? ¿Como hacer eso?
  • ¿Cómo asigno múltiples estilos (para eventos de interacción múltiple) a un control?
  • ¿Existe tal vez incluso una forma más clara de lograr este comportamiento?
  • [edit]
    ¿Qué sucede si quiero, digamos, tener interacción del mouse en todos los controles deslizantes en mi GUI?

Respuesta

68

Martin,

puede asignar un controlador de eventos directamente desde un estilo utilizando un EventSetter:

<Style TargetType="{x:Type Button}"> 
    <EventSetter Event="Click" Handler="SomeAction"/> 
</Style> 

@ColinE:

no soy Asegúrese de usar un estilo para realizar el cableado del evento es una buena idea.Los estilos, por definición, definen la apariencia visual de los controles.

Desafortunadamente, esto parece ser un error común y generalizado acerca de los estilos de WPF: Aunque su nombre sugiere que son, al igual que lo que usted dice, simplemente supone que define la apariencia visual, que son en realidad mucho más: Es útil para ver los estilos de manera más general como un atajo para asignar un conjunto de propiedades a un control.

+0

Genial, eso es exactamente lo que estaba buscando, especialmente en combinación con 'BasedOn =" ... "'. –

1

No estoy seguro de que usar un estilo para realizar el cableado del evento sea una buena idea. Los estilos, por definición, definen la apariencia visual de los controles. ¿Asumo que estás realizando alguna funcionalidad no relacionada con el estilo en tus controladores de eventos?

Si es así, simplemente conectaré estos controles en código detrás.

Puede utilizar herramientas como LINQ al árbol visual para ayudar a localizar múltiples controles que cumplen algunos criterios:

http://www.scottlogic.co.uk/blog/colin/2010/03/linq-to-visual-tree/

A continuación, iterar sobre los controles, el cableado hasta cada uno.

Colin E.

+0

¿Entiendo correctamente que esto podría hacerse en tiempo de ejecución? Por ejemplo, en 'InitializeComponents()' Comienzo en algún elemento raíz y todos los controles con algún atributo específico se conectan al evento apropiado? –

+2

No veo por qué el estilo de un control no puede incluir lo que sucede cuando hace clic en él o pasa el mouse sobre él. – Gabe

+0

Hola Martin, sí, esto se puede hacer desde código subyacente. ¡Gabe ... usar estilos para cablear la funcionalidad me parece mal! ¿Qué sucede cuando quieres 'tema' tu aplicación? – ColinE

Cuestiones relacionadas