如何通过样式设置事件功能?

时间:2010-12-16 11:19:49

标签: c# wpf events styles code-behind

我有几个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>

我不知道是否以及如何在一个动作中调用函数。

  • 是否可以通过创建一个带有action + trigger的样式来应用于每个控件来获得此功能?怎么做?
  • 如何为一个控件分配多个样式(多个交互事件)?
  • 是否有更简洁的方法可以实现这种行为?
  • [编辑]
    如果我想在GUI中的所有滑块上进行鼠标交互,该怎么办?

1 个答案:

答案 0 :(得分:80)

马丁,

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

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

@ColinE:

  

我不确定使用样式来执行事件连接是一个好主意。根据定义,样式定义了控件的视觉外观。

不幸的是,这似乎是对WPF风格的普遍和普遍的误解:虽然他们的名字暗示他们就像你说的那样,仅仅意味着定义视觉外观,但它们实际上更多:它有助于查看样式更一般地,作为将一组属性分配给控件的快捷方式。