Подтвердить что ты не робот

Как установить функцию события через стиль?

У меня есть несколько элементов управления 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 в любую программу GUI и установите стиль для каждого интерактивного элемента управления...)

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

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

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

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

Ответ 1

Martin,

вы можете назначить обработчик события непосредственно из стиля с помощью EventSetter:

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

@ColinE:

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

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

Ответ 2

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

Если это так, я просто подключу этот элемент управления в коде.

Вы можете использовать такие инструменты, как Linq to Visual Tree, чтобы найти несколько элементов управления, соответствующих определенным критериям:

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

Затем перебираем элементы управления, проводя их каждый.

Колин Е.