基于触摸的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"错误,因此决定触摸屏幕,将光标定位在b和t之间,如下所示:
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 Position
从TextBox
到Button
(键盘键)。
这里有一段代码供任何人测试(显然不能提供完整的键盘):
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");
}
你的问题是这一行:
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(尽管我自己没有使用过)。