在WPF中,PreviewTextInput总是只给出一个字符吗

本文关键字:一个 字符 WPF PreviewTextInput | 更新日期: 2023-09-27 18:01:06

在WPF中处理TextBox的PreviewTextInput事件时,事件参数(TextCompositionEventArgs(的Text属性是否可以包含除通过键盘输入的最后一个字符之外的其他字符?

我对它进行了彻底的测试,它似乎只包含最后一个按键的单个字符值。然而,我可能遗漏了一些明显的内容,因为它的类型是String,而不是Char

在WPF中,PreviewTextInput总是只给出一个字符吗

来自UIElement.PreviewTextInput文档。

键盘是预览文本输入的主要方式但是语音,手写和其他输入设备也可以生成预览文本输入

我假设非键盘源能够一次提供多个字母。

是的,正如名称所解释的,它预览了大多数情况下都是单个字符的每个输入。

使用TextCompositionEventArgs,您可以使用e.text.访问新文本

或者,如果你想要完整的文本,你可以像一样得到它

string full = myTextBox.Text.Insert(myTextBox.CaretIndex, e.Text);

是的,它只给你最后一个按下的字符。

它只会给你按下的字符,你如何才能从文本框text属性本身获得完整的文本,如var text = (sender as TextBox).Text

我发现了这个问题,需要通过PreviewTextInput检查TextBox中的结果文本。

Gowshik的回答和Gevo12321在AMS的anwser中的评论的问题是,它没有考虑到用户选择部分文本并用一个字符覆盖它(正如hakamairi所指出的(

为了说明这一点,在插入新字符之前,我删除了选定的部分

TextBox tB = (TextBox)sender;
var oldText = tB.Text;
oldText = oldText.Remove(tB.SelectionStart, tB.SelectionLength);
string newText = oldText.Insert(tB.CaretIndex, e.Text);

但是,下一个边缘情况是人们选择文本的一部分,然后将其拖放到另一个位置。为此,我在PreviewDrop事件中添加了一个事件处理程序,并重新生成并检查生成的字符串

TextBox textBox = (TextBox)sender;
// Get the index position of the dropped text
Point position = e.GetPosition(textBox);
int index = textBox.GetCharacterIndexFromPoint(position, true);
// Remove the selected text, then insert it into the new position
var oldText = textBox.Text;
oldText = oldText.Remove(textBox.SelectionStart, textBox.SelectionLength);
string newText = oldText.Insert(index, textBox.SelectedText);

我能想到的最后一个边缘案例是人们粘贴到TextBox中,但对于我的案例,我禁用了该功能,因为它不需要。