2012-03-01 238 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中提供的輸入事件通常以實現爲隧道/冒泡對的形式實現。隧道事件也是 有時被稱爲預覽事件,因爲用於配對的命名約定爲 。