web-dev-qa-db-fra.com

Comment définir une fonction d'événement via un style?

J'ai plusieurs éléments de contrôle de l'interface graphique dont certains sont censés générer la même action (appel de la fonction de code) sur l'interaction de la souris (MouseNer, Mouseleave).
[EDIT] J'effectue une fonctionnalité non liée à la non-style dans mes manutentionnaires d'événement.
En ce moment, j'utilise des attributs d'événement dans chaque contrôle:

<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" />

Étant donné que de nombreux contrôles dans cet exemple appellent les deux mêmes fonctions "GeneralMouseenter" et "GénéralMouseleave", j'aimerais pouvoir définir un style ou quelque chose de similaire à encapsuler ce comportement.

[Modifier - Clarification]
[.____] Ceci est censé devenir une sorte de plugin plus tard.
[.____] (Inclure les fichiers de code et XAML dans n'importe quel programme d'interface graphique et définissez un style sur chaque élément de contrôle interactif ...)

D'après ce que j'ai trouvé sur le Web, je peux utiliser EventTriggers comme dans cet exemple:

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

Je ne sais pas si et comment appeler des fonctions dans une action.

  • Est-il possible d'obtenir cette fonctionnalité en créant un style avec action + déclencheur à appliquer à chaque contrôle? Comment faire ça?
  • Comment affecter plusieurs styles (pour plusieurs événements d'interaction) à un contrôle?
  • Y a-t-il peut-être même un moyen plus propre d'atteindre ce comportement?
  • [Éditer]
    [.____] Et si je le veux, disons-y une interaction de la souris sur tous les curseurs de mon interface graphique?
36
Martin Hennings

Martin,

vous pouvez attribuer un gestionnaire d'événements directement à partir d'un style à l'aide d'un événement d'événements:

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

@Coline:

Je ne suis pas sûr que l'utilisation d'un style pour effectuer l'événement Wire-up est une bonne idée. Styles, par définition, définir l'apparence visuelle des contrôles.

Malheureusement, cela semble être une idée fausse courante et répandue sur les styles WPF: bien que leur nom suggère qu'ils sont, comme ce que vous dites, veulent simplement définir l'apparence visuelle, ils sont effectivement beaucoup plus: il est utile de voir des styles plus généralement comme un raccourci pour attribuer un ensemble de propriétés à un contrôle.

88
gstercken