【问题标题】:Insert text programmatically at caret position in WPF DataGrid cell when shortcut is pressed按下快捷方式时,以编程方式在 WPF DataGrid 单元格中的插入符号位置插入文本
【发布时间】:2016-06-08 13:33:46
【问题描述】:

当用户按下 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 功能。我必须使用双重或三重制表符来编辑下一个单元格。

<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
    }

【问题讨论】:

    标签: c# wpf datagrid datagridtextcolumn


    【解决方案1】:

    添加一个样式,在 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2014-03-19
      • 2010-11-10
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多