Как установить функцию события через стиль? - PullRequest
31 голосов
/ 16 декабря 2010

У меня есть несколько элементов управления GUI, некоторые из которых должны генерировать одно и то же действие (вызов функции с выделенным кодом) при взаимодействии с мышью (MouseEnter, MouseLeave).
[edit] Я выполняю некоторые не-стилисвязанные функции в моих обработчиках событий.
Сейчас я использую атрибуты событий в каждом элементе управления:

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

Поскольку многие элементы управления в этом примере вызывают одни и те же две функции "GeneralMouseEnter" и«GeneralMouseLeave», я хотел бы иметь возможность определить стиль или что-то подобное для инкапсуляции этого поведения.

[править - уточнение]
Это должно стать своего рода плагином позже
(Включить код и файлы XAML в любую программу с графическим интерфейсом и установить стиль для каждого интерактивного элемента управления ...)

Из того, что я нашел в Интернете, я могу использовать EventTriggers как в этом примере:

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

Я не знаю, если и как вызывать функции в действии.

  • Возможно ли получить эту функциюпутем создания стиля с действием + триггер, который будет применяться к каждому элементу управления?Как это сделать?
  • Как назначить несколько стилей (для нескольких событий взаимодействия) одному элементу управления?
  • Возможно, есть даже более чистый способ достижения этого поведения?
  • [править]
    Что, если я хочу, скажем, взаимодействовать с мышью на всех ползунках моего графического интерфейса?

1 Ответ

80 голосов
/ 17 декабря 2010

Martin

Вы можете назначить обработчик событий непосредственно из стиля, используя EventSetter:

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

@ Coline:

Я не уверен, что использование стиля для организации события - хорошая идея. Стили по определению определяют внешний вид элементов управления.

К сожалению, это, кажется, распространенное и широко распространенное заблуждение о стилях WPF: хотя их название предполагает, что они, как и вы говорите, просто предназначены для определения визуального внешнего вида, на самом деле они гораздо больше: полезно просматривать стили в более общем смысле, как ярлык для назначения набора свойств для элемента управления.

...