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>

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

4

2 回答 2

3

一个原因可能是事件是在 内部处理的DataGridCell,因此它不会到达您的处理程序。您可以尝试事件的隧道版本,即PreviewMouseDown.

于 2012-03-01T13:31:31.267 回答
1

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

这是路由事件的概述

3种类型的事件是:

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

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

隧道:最初,调用元素树根处的事件处理程序。然后,路由事件沿着路由穿过连续的子元素,到达作为路由事件源的节点元素(引发路由事件的元素)。隧道路由事件通常作为控件合成的一部分使用或处理,这样来自合成部分的事件可以被故意抑制或替换为特定于完整控件的事件。WPF 中提供的输入事件通常以隧道/冒泡对的形式实现。由于对使用的命名约定,隧道事件有时也称为预览事件。

于 2012-03-01T13:35:31.987 回答