基于触摸的WPF应用程序中的文本框问题

本文关键字:应用程序 文本 问题 WPF 触摸 于触摸 | 更新日期: 2023-09-27 18:08:19

我在我的WPF应用程序中使用XAML和c# (ofc)制作了一个功能齐全的触摸键盘。目前,键盘上按下的每个键都会在文本框中注册相应的键;然而,如果用户触摸到TextBox(这是受欢迎的……我不想阻止它)在TextBox中更早地定位光标以修复他们可能键入的错误,然后与键交互(如预期的),他们请求的位置不注册,键继续在末尾输入。

例如,用户类型(注意|充当游标)::

Justin is awesome, bt that is because it is his birthday.|

用户看到单词"but"拼写为"bt"错误,因此决定触摸屏幕,将光标定位在bt之间,如下所示:

Justin is awesome, b|t that is because it is his birthday.

用户期望然后触摸键盘上的U,并在光标出现的地方输入它…不幸的是(目前)它是这样结束的:

Justin is awesome, bt that is because it is his birthday.U|

如果我启用鼠标,同样的事情也会发生(所以它可能不是触摸所独有的)。如果我在触摸一个位置后插入键盘,我可以用插入的键盘打字,没有问题。

实现的触摸键盘只是不能正确读取位置。看着这个,动作似乎没有去任何地方,因为Cursor PositionTextBoxButton(键盘键)。

这里有一段代码供任何人测试(显然不能提供完整的键盘):

XAML

<Grid>
  <TextBox x:Name="txtBox" />
  <Button x:Name="btnQ" Content="q" Click="btnQ_Click"/>
  <Button x:Name="btnW"   Content="w" Click="btnW_Click"/>
</Grid>
c#

    private bool numberHitSinceLastOperator = false;
    private void HandleKeyboard(string key)
    {
        //Ternary operator
        string valueSoFar = numberHitSinceLastOperator ? txtBox.Text : "";
        string newValue = valueSoFar + key.ToString();
        txtBox.Text = newValue;
        numberHitSinceLastOperator = true;
    }
    private void btnQ_Click(object sender, RoutedEventArgs e)
    {
        HandleKeyboard("Q");
    }
    private void btnW_Click(object sender, RoutedEventArgs e)
    {
        HandleKeyboard("W");
    }

基于触摸的WPF应用程序中的文本框问题

你的问题是这一行:

string newValue = valueSoFar + key.ToString();

你总是在结尾追加。要在正确的位置追加内容,可以这样做:

int oldCaretIndex = txtBox.CaretIndex;
txtBox.Text = txtBox.Text.Insert(text.CaretIndex, "a");
//changing Text resets the caret position to 0
txtBox.CaretIndex = oldCaretIndex + 1;

你也可以尝试模拟按键,例如:我如何在c#中以编程方式生成按键事件?

或者,像评论者建议的那样,尝试一下SurfaceSDK(尽管我自己没有使用过)。