【问题标题】:Activate a textbox automatically when user starts typing用户开始输入时自动激活文本框
【发布时间】:2014-08-24 19:56:02
【问题描述】:

我想在用户开始在我的 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 事件中获得准确输入的字符?

【问题讨论】:

  • 您可以模拟控件上的按键,让它单独执行相应的逻辑。
  • @YoryeNathan 是否可以在 Windows 应用商店应用程序中使用?如果有,怎么做?
  • 我不熟悉商店应用程序和限制。查看 SendKeys、SendInput 和 PostMessage 以查看它们是否适用。
  • @YoryeNathan 好像这些功能在商店应用中是不可用的。
  • 看看这个 MSDN 论坛帖子是否有帮助 social.msdn.microsoft.com/Forums/en-US/…

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


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多