当用户开始输入时自动激活文本框



我想在用户开始在我的Windows 8.1商店应用程序中输入时激活一个文本框。

我尝试处理PageKeyDown事件,类似于以下代码:

    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,它使屏幕上的键盘总是出现在平板电脑上。

那么,我该怎么办呢?有没有办法得到确切的类型字符在KeyDown事件?

正如Mark Hall所建议的,CoreWindow.CharacterReceived事件似乎可以帮助解决这个问题。

所以,我在这里找到了最终的答案。

这是来自该链接的代码:

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

最新更新