WPF DataGrid开始编辑单元格时自动全选文本如何禁止
问题描述
我将mdb数据库的内容加载到DataTable对象中,绑定到DataGrid控件进行展示以支持编辑操作。当按下F2键开始编辑单元格时,单元格内的全部文本会被自动选中。
请问是否有方法可以取消该默认的全选标记行为?
我的DataGrid控件XAML标记代码如下:
<DataGrid VirtualizingStackPanel.VirtualizationMode="Standard" Height="750" Width="1920" CanUserResizeColumns="True" CanUserReorderColumns="False" CanUserResizeRows="False" RowHeight="25" FrozenColumnCount="1" x:Name="DataGrid1" CanUserAddRows="False" CanUserSortColumns="False" AutoGenerateColumns="False" FontSize="13" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,120" SelectionUnit="CellOrRowHeader" SelectionMode="Extended"> <DataGrid.Columns> <DataGridTextColumn Width="450" Header=" Column1 " Binding="{Binding Column1}"> <DataGridTextColumn.EditingElementStyle> <Style TargetType="TextBox"> <Setter Property="MaxLength" Value="150"></Setter> </Style> </DataGridTextColumn.EditingElementStyle> </DataGridTextColumn> <DataGridTextColumn Width="120" Header=" Column2 " Binding="{Binding Column2}"> <DataGridTextColumn.EditingElementStyle> <Style TargetType="TextBox"> <Setter Property="MaxLength" Value="10"></Setter> </Style> </DataGridTextColumn.EditingElementStyle> </DataGridTextColumn> </DataGrid.Columns> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <EventSetter Event="KeyDown" Handler="DATAGRID_Keydown" ></EventSetter> </Style> </DataGrid.RowStyle> </DataGrid>
我的C#后台代码如下:
private void DATAGRID_Keydown(object sender, KeyEventArgs e) { if (e.Key == Key.Tab | e.Key == Key.F2) { DataGrid1.BeginEdit(); } }
解决方案
编辑单元格自动全选是WPF DataGrid 进入编辑模式的原生默认行为,要实现进入编辑时光标定位到文本末尾、取消全选,有两种可直接落地的实现方式:
方法1:编辑控件全局事件处理(推荐,适配所有进入编辑的触发场景)
直接在现有DataGridTextColumn.EditingElementStyle的TextBox样式中增加焦点事件,统一处理光标逻辑,不管是按F2、双击还是Tab进入编辑都能生效。
首先修改XAML中两个文本列的编辑样式,给TextBox增加GotFocus事件绑定:
<!-- Column1的编辑样式 --> <Style TargetType="TextBox"> <Setter Property="MaxLength" Value="150"></Setter> <!-- 新增事件绑定 --> <EventSetter Event="GotFocus" Handler="EditingTextBox_GotFocus"/> </Style> <!-- Column2的编辑样式同步加同样的事件即可 --> <Style TargetType="TextBox"> <Setter Property="MaxLength" Value="10"></Setter> <EventSetter Event="GotFocus" Handler="EditingTextBox_GotFocus"/> </Style>
然后在后台.cs文件添加事件处理方法,这里用低优先级的Dispatcher延迟执行,是为了等DataGrid原生的全选逻辑执行完再覆盖设置,避免不生效:
private void EditingTextBox_GotFocus(object sender, RoutedEventArgs e) { var textBox = sender as TextBox; if (textBox == null) return; textBox.Dispatcher.BeginInvoke(new Action(() => { // 取消全选,光标移动到文本末尾 textBox.SelectionStart = textBox.Text.Length; textBox.SelectionLength = 0; }), System.Windows.Threading.DispatcherPriority.ContextIdle); }
方法2:修改现有按键触发逻辑
如果不想新增全局事件,也可以直接修改现有的DATAGRID_Keydown方法,在触发编辑后主动设置光标位置:
private void DATAGRID_Keydown(object sender, KeyEventArgs e) { // 注意:原代码用的位或|不符合布尔判断规范,这里改成逻辑或|| if (e.Key == Key.Tab || e.Key == Key.F2) { DataGrid1.BeginEdit(); DataGrid1.Dispatcher.BeginInvoke(new Action(() => { var editingElement = DataGrid1.GetCurrentCellEditingElement() as TextBox; if (editingElement != null) { editingElement.SelectionStart = editingElement.Text.Length; editingElement.SelectionLength = 0; } }), System.Windows.Threading.DispatcherPriority.ContextIdle); } }
这个方法仅对Tab、F2按键触发编辑的场景生效,如果有鼠标双击进入编辑的需求,还是选第一种方法更稳妥。
内容的提问来源于stack exchange,提问作者Mario Allw
相关产品推荐
相关产品推荐

