我想捕获DataGrid对象的所有单元格的MouseDown事件。我为它指定了一个处理程序:
<DataGrid AutoGenerateColumns="False" Height="200" HorizontalAlignment="Left" Margin="66,119,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Path=ID}" />
<DataGridTextColumn Header="Text" Binding="{Binding Path=Text}" />
</DataGrid.Columns>
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="MouseDown" Handler="CellMouseDown" />
</Style>
</DataGrid.Resources>
</DataGrid>
但事件处理程序不会被调用。为什么呢?
答案 0 :(得分:3)
一个原因可能是事件是在DataGridCell
内处理的,因此它无法到达您的处理程序。您可以尝试PreviewMouseDown
的事件的tunneling版本。
答案 1 :(得分:1)
您的事件可能正由另一个处理程序在处理您的处理程序时处理。
以下是路由事件
的概述3种类型的事件是:
冒泡:调用事件源上的事件处理程序。路由 然后事件路由到连续的父元素,直到到达 元素树根。大多数路由事件使用冒泡路由 战略。冒泡路由事件通常用于报告输入或 来自不同控件或其他UI元素的状态更改。
直接:只有源元素本身才有机会 调用处理程序作为响应。这类似于“路由” Windows窗体用于事件。但是,与标准CLR事件不同, 直接路由事件支持类处理(类处理是 在即将发布的部分中解释)并且可以由EventSetter和 EventTrigger。
隧道:最初,元素树根处的事件处理程序是 调用。路由事件然后通过连续的路线 沿着路径的子元素,朝向节点元素 路由事件源(引发路由事件的元素)。 隧道路由事件经常被使用或作为一部分来处理 合成控件,以便复合零件的事件可以 被故意压制或被特定的事件取代 完全控制。 WPF中提供的输入事件经常出现 实现为隧道/冒泡对。隧道活动也是 由于命名,有时称为预览事件 用于配对的约定。