我想捕获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>
但不会调用事件处理程序。为什么?
一个原因可能是事件是在DataGridCell
内部处理的,因此它不会到达您的处理程序。您可以尝试事件的隧道版本PreviewMouseDown
。
您的事件可能正在由另一个处理程序处理,而它将转到您的处理程序。
以下是路由事件的概述
三种类型的事件是:
气泡:调用事件源上的事件处理程序。路由事件然后路由到连续的父元素,直到到达元素树根。大多数路由事件使用冒泡路由策略冒泡路由事件通常用于报告输入或不同控件或其他UI元素的状态变化。
直接:只有源元素本身有机会调用处理程序作为响应。这类似于Windows窗体用于事件。但是与标准CLR事件不同,直接路由事件支持类处理(类处理是在下一节中解释),并且可以由EventSetter和事件触发器。
隧道:最初,元素树根处的事件处理程序是调用。然后,路由事件通过连续的沿着路由的子元素,指向作为路由事件源(引发路由事件的元素)。隧道路由事件通常作为控件的合成,以便来自合成部件的事件可以被特定于完全控制。WPF中提供的输入事件经常出现实现为隧道/冒泡对。隧道事件也是有时称为预览事件,因为命名用于配对的约定。