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

Posted

技术标签:

【中文标题】如何通过样式设置事件功能?【英文标题】:How to set an event function via a style? 【发布时间】:2011-05-26 12:03:53 【问题描述】:

我有几个 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”,我希望能够定义一种样式或类似的东西来封装该行为。

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

根据我在网上找到的信息,我可以使用EventTriggers,就像在这个例子中一样:

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

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

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

【问题讨论】:

【参考方案1】:

马丁,

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

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

@ColinE:

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

不幸的是,这似乎是关于 WPF 样式的普遍且普遍存在的误解:尽管它们的名称暗示它们,就像您所说的那样,仅用于定义视觉外观,但它们实际上更多:查看样式很有帮助更一般地作为将一组属性分配给控件的快捷方式。

【讨论】:

太好了,这正是我一直在寻找的——尤其是结合BasedOn="..." 这仅在您使用类下的样式标签时才有效。如果您在单独的字典中使用它,则会引发此错误:“ResourceDictionary”根元素需要 x:Class 属性来支持 XAML 文件中的事件处理程序。删除 Click 事件的事件处理程序,或将 x:Class 属性添加到根元素。如果字典是类中的合并字典,显然不能使用字典中的 X:Class 属性。 EventSetter 中的事件必须是RoutedEvent(不适用于TargetUpdated @Ghosthack 但是,专门针对TargetUpdated 存在workaround Binding.TargetUpdated

以上是关于如何通过样式设置事件功能?的主要内容,如果未能解决你的问题,请参考以下文章

通过 ngModel Binding 设置值时如何在 textarea 上触发更改事件

在事件渲染过程中如何修改FullCalendar上每个事件的css样式?

tkinter如何设置好看的按钮

我如何通过AWS SNS设置有关上传事件的AWS S3?

如何在 cellTap 事件中获取特定的 RadCalendar Day Cell 并向其添加自定义样式

如何调整链接到悬停事件的动画?