如何通过样式设置事件功能?
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样式?