2012-03-01 198 views
1

我想捕获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> 

但是事件处理程序没有被调用。为什么?

回答

3

其中一个原因可能是该事件在DataGridCell内处理,所以它不会到达您的处理程序。您可以尝试tunneling版本的事件PreviewMouseDown

1

您的事件可能由另一个处理程序在处理您的处理程序时处理。

以下为路由事件

的3种类型的事件是概述:

鼓泡:事件源上的事件处理程序被调用。然后,路由到的事件将路由到连续的父元素,直到到达元素树根目录为止,即 事件。大多数路由事件使用冒泡路由 策略。冒泡路由事件通常用于报告输入或来自不同控件或其他UI元素的状态更改。

直接:只有源元素本身才有机会以 调用处理程序作为响应。这类似于Windows窗体用于事件的“路由”。但是,与标准CLR事件不同, 直接路由事件支持类处理(在下一节中解释类处理为 ),并且可以由EventSetter和 使用EventTrigger。

隧道:最初,调用元素树根处的事件处理程序 。然后,路由事件沿着路径传播沿路由的子元素的路由,朝向作为路由事件源(引发路由事件的元素)的节点元素。 隧道路由事件经常被用作或处理为合成控件的一部分,使得来自复合材料部件的事件可以被故意压制或被特定于完全控制的事件替代。在WPF中提供的输入事件通常以实现为隧道/冒泡对的形式实现。隧道事件也是 有时被称为预览事件,因为用于配对的命名约定为 。