当用户开始在我的Windows 8.1 Store应用程序中输入时,我想激活一个文本框。
我尝试处理KeyDown
的{{1}}事件,类似于以下代码:
Page
但问题是 private void pageRoot_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (SearchBox.FocusState == Windows.UI.Xaml.FocusState.Unfocused)
{
string pressedKey = e.Key.ToString();
SearchBox.Text = pressedKey;
SearchBox.Focus(Windows.UI.Xaml.FocusState.Keyboard);
}
}
总是返回按下的键的大写英文字符,而用户可能正在输入另一种语言。例如,波斯语键盘中的键e.Key.ToString()
类型D
,用户可能希望输入波斯语,但ی
仍会返回e.Key.ToString()
而不是D
此外,我尝试使该文本框始终聚焦(我的页面包含一些网格视图等等,以及文本框),虽然此解决方案适用于PC,但它使屏幕键盘始终显示在平板电脑上。
那么,我该怎么办?有没有办法在ی
事件中获得确切类型的字符?
答案 0 :(得分:1)
正如Mark Hall所说,CoreWindow.CharacterReceived
事件似乎有助于解决这个问题。
所以,我找到了最终答案here。
这是该链接的代码:
public Foo()
{
this.InitializeComponent();
Window.Current.CoreWindow.CharacterReceived += KeyPress;
}
void KeyPress(CoreWindow sender, CharacterReceivedEventArgs args)
{
args.Handled = true;
Debug.WriteLine("KeyPress " + Convert.ToChar(args.KeyCode));
return;
}
但是此事件将在与当前活动页面无关的任何地方触发。因此,当用户导航到另一个页面时,我必须删除该事件,并在用户返回时再次添加该事件。
更新:我还必须将文本框的光标移动到文本的末尾,这样用户才能自然地写。这是我的最终代码:
private void KeyPress(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.CharacterReceivedEventArgs args)
{
if (SearchBox.FocusState == Windows.UI.Xaml.FocusState.Unfocused)
{
SearchBox.Text = Convert.ToChar(args.KeyCode).ToString();
SearchBox.SelectionStart = SearchBox.Text.Length;
SearchBox.SelectionLength = 0;
SearchBox.Focus(FocusState.Programmatic);
}
}
private void pageRoot_GotFocus(object sender, RoutedEventArgs e)
{
Window.Current.CoreWindow.CharacterReceived += KeyPress;
}
private void pageRoot_LostFocus(object sender, RoutedEventArgs e)
{
Window.Current.CoreWindow.CharacterReceived -= KeyPress;
}