【问题标题】:TextBox issue in Touch-based WPF Application基于触摸的 WPF 应用程序中的文本框问题
【发布时间】:2026-02-09 17:35:01
【问题描述】:

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

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

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.

然后用户希望 touch U 在键盘上,然后在光标所在的位置输入它......不幸的是(目前)它最终是这样的:

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

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

实现的触摸键盘无法正确读取位置。查看this,操作似乎无处可去,因为Cursor PositionTextBox 变为Button(键盘键)。

这是一个sn-p代码供任何人测试(显然不能提供全键盘):

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");
    }

【问题讨论】:

  • 不是您问题的真正答案,但您可以将SurfaceSDK(最初为 Surface 和 Pixelsense 设计)用于支持触控的 UI 组件。我在广泛的项目中使用它们,它们可以在所有不同类型的带有默认 WPF 的触摸屏上工作。
  • @StevenHouben 感谢您的建议!我查看了 SDK,如果遇到其他问题,我会考虑使用它。 :)

标签: c# wpf xaml touch


【解决方案1】:

你的问题是这一行:

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;

您也可以尝试模拟按键,例如:How can I programmatically generate keypress events in C#?

或者,就像评论者建议的那样,试试 SurfaceSDK(虽然我自己没有使用过)。

【讨论】:

  • 引导我找到正确的方向和解决方案,谢谢! :)