我在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事件。
答案 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事件并在那里取消选择您的单元格。您调用此方法的时间对于它的成功至关重要。