按下快捷方式时,以编程方式在 WPF DataGrid 单元格中的插入符号位置插入文本
Insert text programmatically at caret position in WPF DataGrid cell when shortcut is pressed
如何在用户按下 Alt+X 时在 DataGridTextColumn 中的插入符号位置插入文本?
这是数据网格
<DataGrid x:Name="TheGrid" SelectionUnit="Cell" ItemsSource="{Binding Soruce}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataGrid.Columns>
</DataGrid>
我尝试制作自己的 CellEditingTemplate 和 CellTemplate。但是当我那样做时,它会扰乱网格的 Tab 功能。我必须按两次或三次 Tab 键才能编辑下一个单元格。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" KeyDown="TextBox_KeyDown"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
代码隐藏。您不能将文本直接插入数据绑定模型,因为您必须知道插入符号的位置。
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
//Insert text at caret position
}
添加一个样式,为 KeyDown 事件在 EditingElementStyle 上添加一个 EventSetter。
<DataGrid x:Name="TheGrid" SelectionUnit="Cell" ItemsSource="{Binding Soruce}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<EventSetter Event="KeyDown" Handler="TextBox_KeyDown" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
然后将事件处理程序添加到后面的代码中。在 SelectedText 属性上插入文本以获得熟悉的行为,然后将插入符号移动到插入的文本之后。
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.SystemKey == Key.X && Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
{
string text = "Text to insert";
TextBox textBox = sender as TextBox;
textBox.SelectedText = text;
textBox.SelectionStart = textBox.SelectionStart + text.Length;
textBox.SelectionLength = 0;
}
}
如何在用户按下 Alt+X 时在 DataGridTextColumn 中的插入符号位置插入文本?
这是数据网格
<DataGrid x:Name="TheGrid" SelectionUnit="Cell" ItemsSource="{Binding Soruce}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataGrid.Columns>
</DataGrid>
我尝试制作自己的 CellEditingTemplate 和 CellTemplate。但是当我那样做时,它会扰乱网格的 Tab 功能。我必须按两次或三次 Tab 键才能编辑下一个单元格。
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" KeyDown="TextBox_KeyDown"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
代码隐藏。您不能将文本直接插入数据绑定模型,因为您必须知道插入符号的位置。
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
//Insert text at caret position
}
添加一个样式,为 KeyDown 事件在 EditingElementStyle 上添加一个 EventSetter。
<DataGrid x:Name="TheGrid" SelectionUnit="Cell" ItemsSource="{Binding Soruce}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<EventSetter Event="KeyDown" Handler="TextBox_KeyDown" />
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
然后将事件处理程序添加到后面的代码中。在 SelectedText 属性上插入文本以获得熟悉的行为,然后将插入符号移动到插入的文本之后。
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.SystemKey == Key.X && Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
{
string text = "Text to insert";
TextBox textBox = sender as TextBox;
textBox.SelectedText = text;
textBox.SelectionStart = textBox.SelectionStart + text.Length;
textBox.SelectionLength = 0;
}
}