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

Mar*_*ngs 34 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" />
Run Code Online (Sandbox Code Playgroud)

由于此示例中的许多控件都调用相同的两个函数"GeneralMouseEnter"和"GeneralMouseLeave",因此我希望能够定义一个样式或类似的东西来封装该行为.

[编辑 - 澄清]
这应该成为后来的一种插件.
(将代码和XAML文件包含到任何GUI程序中,并在每个交互式控件元素上设置样式...)

根据我在网络上发现的内容,我可以EventTriggers在此示例中使用:

<Style.Triggers>
  <EventTrigger RoutedEvent="Click">
    <EventTrigger.Actions>
      <BeginAction TargetName="SomeAction" />
    </EventTrigger.Actions>
  </EventTrigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)

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

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

gst*_*ken 83

马丁,

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

<Style TargetType="{x:Type Button}">
  <EventSetter Event="Click" Handler="SomeAction"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

@ColinE:

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

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

  • 这仅在您使用类下的样式标记时才有效。如果您在单独的字典中使用它,则会引发此错误:“ResourceDictionary”根元素需要 ax:Class 属性来支持 XAML 文件中的事件处理程序。删除 Click 事件的事件处理程序,或将 ax:Class 属性添加到根元素。显然字典中的 X:Class 属性不能使用,如果字典是类中的合并字典。 (2认同)