6

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

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

我的数据网格(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:
如果有帮助,我将使用 DataGridTemplateColumns 和 TextBlocks 来显示我的数据。这会导致这种行为吗?

解决方案:Peter Hansen
的建议 解决了这个问题,即向 DataGrid 以及 PreviewMouseDown 事件添加一个 PreviewMouseRightButtonDown 事件。

4

2 回答 2

5

我认为您看到的是单元格的边框,当它具有焦点时正在显示。

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

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

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

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

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

于 2012-11-01T17:23:05.600 回答
1

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

dataGrid.UnselectAllCells();

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

编辑:我认为您的 dataGrid.UnselectAllCells() 没有调用,因为您仍在 PreviewMouseDown 事件中。尝试进行相应的 PreviewRightMouseButtonUp 事件并在此处取消选择您的单元格。调用此方法的时间可能对其成功至关重要。

于 2012-11-01T14:53:37.060 回答