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

时间:2014-08-24 19:56:03

标签: c# windows-8 windows-runtime windows-8.1

当用户开始在我的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,但它使屏幕键盘始终显示在平板电脑上。

那么,我该怎么办?有没有办法在ی事件中获得确切类型的字符?

1 个答案:

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