WPF DataGrid PreviewMouseDown未按预期处理右键单击

时间:2012-11-01 14:45:41

标签: c# wpf datagrid mouseevent

我在User Control中设置了一个带有PreviewMouseDown事件的DataGrid。这个想法是,当用户将鼠标移动到单元格中时,它会根据单元格的内容设置要运行的Action,并且无论使用哪个鼠标按钮,Action都将在用户单击时运行。 我的事件处理程序(C#):

private void LadderMouseClick(object sender, System.Windows.Input.MouseButtonEventArgs e)  {
        if (m_ActiveAction != null) {
            m_ActiveAction();
        }
        e.Handled = true;
    }

我的DataGrid(XAML):

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False"  EnableRowVirtualization="True"  ItemsSource="{Binding Source={StaticResource sourceCollection}}" Name="DataGrid" RowDetailsVisibilityMode="Collapsed" IsReadOnly="True" Height="600" MouseLeave="DataGrid_MouseLeave" MouseEnter="DataGrid_MouseEnter" PreviewMouseDown="LadderMouseClick" PreviewMouseDoubleClick="LadderMouseDoubleClick" VerticalScrollBarVisibility="Hidden" SelectionUnit="Cell" SelectionMode="Single">

这很有效,当用户右键或左键点击DataGrid时,可以正常运行该操作。然而,问题在于,当用户右键单击时,他们的鼠标所在的单元格会被选中(单元格周围会出现黑色边框);当他们左键单击时不会发生这种情况。

他们为什么表现不一样?它们不应该以同样的方式处理吗?有什么东西真的很简单吗?

提前致谢!

编辑:
到目前为止,我已经尝试过DataGrid.UnselectAll(),DataGrid.UnselectAllCells(),DataGrid.SelectedIndex = -1,以及DataGrid.CurrentCell = default(DataGridCellInfo)。他们都没有为我工作。

编辑#2:
如果它有帮助,我正在使用带有TextBlocks的DataGridTemplateColumns来显示我的数据。这会导致这种行为吗?

解:
这是通过Peter Hansen的建议来解决的,该建议是将PreviewMouseRightButtonDown事件添加到DataGrid以及PreviewMouseDown事件。

2 个答案:

答案 0 :(得分:4)

我认为你所看到的是细胞的边界,当它具有焦点时会显示。

您可以通过将其厚度设置为0来删除它,如下所示:

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Setter Property="BorderThickness" Value="0" />
    </Style>
</DataGrid.CellStyle>

<强>更新
显然,当您设置要处理的PreviewMouseDown事件时,DataGrid仅在您使用鼠标左键时停止选择单元格。

您还必须处理PreviewMouseRightButtonUp以阻止右键单击选择单元格。

我认为这会解决你的问题吗?

答案 1 :(得分:1)

您应该能够调用DataGrids附带的UnselectAllCells方法。 它看起来像这样:

dataGrid.UnselectAllCells();

执行点击操作后调用此选项,它应删除单元格选择。

编辑:我认为你的dataGrid.UnselectAllCells()没有调用,因为你仍然在PreviewMouseDown事件中。尝试制作相应的PreviewRightMouseButtonUp事件并在那里取消选择您的单元格。您调用此方法的时间对于它的成功至关重要。