如何通过样式设置事件函数?

48

我有几个GUI控件元素,其中一些应该在鼠标交互(MouseEnter,MouseLeave)时生成相同的操作(代码后台函数调用)。
[编辑]我正在我的事件处理程序中执行一些非样式相关功能。
目前,我在每个控件中使用事件属性:

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

我不知道如何在动作中调用函数。

  • 通过创建具有动作+触发器的样式并应用于每个控件,是否可以获得此功能?如何操作?
  • 如何将多个样式(用于多个交互事件)分配给一个控件?
  • 也许还有更简洁的方法来实现此行为吗?
  • [编辑]
    如果我想在GUI中所有滑块上进行鼠标交互怎么办?
1个回答

110

Martin,

你可以使用EventSetter直接从样式中分配事件处理程序:

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

@ColinE:

我不确定使用样式来执行事件绑定是否是个好主意。 样式的定义是用来定义控件的视觉外观。

很遗憾,这似乎是关于WPF样式一个普遍而广泛的误解:虽然它们的名称暗示着和你说的一样只是用来定义视觉外观,但实际上它们更多地被看作是为控件分配一组属性的快捷方式,因此把样式理解得更加通用会更有帮助。


1
太好了,这正是我所寻找的 - 特别是与 BasedOn="..." 结合使用。 - Martin Hennings
2
只有在类下使用样式标签才有效。如果您将其用于单独的字典中,则会引发以下错误:“ResourceDictionary”根元素需要一个x:Class属性来支持XAML文件中的事件处理程序。要么删除Click事件的事件处理程序,要么在根元素中添加x:Class属性。显然,在类中合并的字典中不能使用字典中的X:Class属性。 - luka
EventSetter 中的事件必须是 RoutedEvent(不适用于 TargetUpdated)。 - Brains
@Ghosthack,然而,特别针对TargetUpdated,存在一个解决方法Binding.TargetUpdated - Brains

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接