handler不处理事件

时间:2012-03-01 13:27:20

标签: .net wpf datagrid event-handling mousedown

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

但事件处理程序不会被调用。为什么呢?

2 个答案:

答案 0 :(得分:3)

一个原因可能是事件是在DataGridCell内处理的,因此它无法到达您的处理程序。您可以尝试PreviewMouseDown的事件的tunneling版本。

答案 1 :(得分:1)

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

以下是路由事件

的概述

3种类型的事件是:

  

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

     

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

     

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