【问题标题】:How to make TextBox lose its focus?如何让TextBox失去焦点?
【发布时间】:2018-08-03 04:34:30
【问题描述】:

当用户触摸Enter虚拟键时,如何使TextBox失去焦点并隐藏屏幕键盘?

    private void TheName_KeyDown(object sender, KeyRoutedEventArgs e) {
        var tb = sender as TextBox;
        if (e.Key == Windows.System.VirtualKey.Enter) {
            // ... tb.LooseTheFocus_PLEASE(); !???
        }
    }

【问题讨论】:

  • 实际上不能。您必须将焦点设置到另一个控件。
  • 怎么做?我试过 this.Focus(Windows.UI.Xaml.FocusState.Pointer) - 忽略。
  • 尝试 [我的解决方案][1] 在 Windows 8 上隐藏触摸键盘。[1]:stackoverflow.com/questions/20858141/…
  • @Harry 这可能也应该用 UWP 标记。 Win phone 8 已经死了,但这仍然很有用。

标签: c# windows-phone-8


【解决方案1】:
    /// <summary>
    /// Makes virtual keyboard disappear
    /// </summary>
    /// <param name="sender"></param>
    private void LoseFocus(object sender) {
        var control = sender as Control;
        var isTabStop = control.IsTabStop;
        control.IsTabStop = false;
        control.IsEnabled = false;
        control.IsEnabled = true;
        control.IsTabStop = isTabStop;
    }

    /// <summary>
    /// Makes virtual keyboard disappear when user taps enter key
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void LooseFocusOnEnter(object sender, KeyRoutedEventArgs e) {
        if (e.Key == Windows.System.VirtualKey.Enter) {
            e.Handled = true; LoseFocus(sender);
        }
    }

太丑了。但它有效。关键部分是 IsTabStop 属性。如果我不触摸它 - 键盘会消失几分之一秒,然后再次出现。

【讨论】:

  • 以同样的方式存储控件IsTabStop,然后在更改后恢复到该值,我建议也对IsEnabled 执行相同的操作。另外,可能有点挑剔,但我建议让LoseFocus() 使用Control 而不是object。最好向调用该函数的人表明您要求他们传入Control,因为您在内部进行了转换(它只是冒着容易避免的无效转换异常的风险,而且我真的不是粉丝使用object 的人绝对没有必要!)。
【解决方案2】:

只需将焦点设置在页面上即可。

this.Focus();

【讨论】:

  • 这在 WP 8.1 应用程序中不起作用。焦点需要一个参数,但无论我提供什么,虚拟键盘都会一直存在,直到我点击 TextBox 外的空白区域。
  • 非常感谢! :)
  • 不错@Pantelis!
  • 这适用于 WP 10。使用 this.Focus(FocusState.Programmatic);
【解决方案3】:

要在 UWP 应用中分散注意力,只需执行以下操作:

private void Input_KeyDown(object sender, KeyRoutedEventArgs e)
{
    if (e.Key == VirtualKey.Enter)
    {
        //Do what you want upon enter
        this.Focus(FocusState.Programmatic);
    }
}

【讨论】:

    【解决方案4】:

    无法以编程方式从控件中移除焦点。

    一个选项是将焦点设置在表单上的另一个控件上,比如一个标签,它解释了应该在 TextBox 中输入哪种文本。

    这会导致文本框失去焦点。

    如this关于Control.Focus()的文档所示:

    您不能通过使用 FocusState.Unfocused 作为参数调用此方法来从控件中移除焦点。该值是不允许的,会导致异常。要从控件中移除焦点,请将焦点设置到其他控件。

    只需使用Control.Focus(FocusState.Programmatic) 设置焦点。任何控件都应该这样做。

    【讨论】:

    • 不起作用。当我尝试将焦点设置在标签(或任何其他元素)上时,什么也没有发生。
    • 我不想这么说,但我试过了,但它不起作用。我设置了 FocusState.Programatic - 并且该行被忽略了。我已经尝试了 Focus() 参数的所有可能值,但没有运气。我试图集中页面、网格、TextBlock 元素,它只是拒绝工作。我把代码放在 KeyDown 处理程序中,也许它不能从那里调用?
    • 你的事件是否被触发了?设置断点并查看它是否进入您的事件。
    • 是的,它被解雇了,让我在这里回答我自己的问题,让它工作有一个丑陋的技巧......
    • 我实际上阅读了 Pantelis 在他的评论中给出的答案。讨厌的解决方案,但如果没有其他工作.. ;)
    【解决方案5】:

    如果您有多个文本框,只需在它们之间转移焦点。

    _first_tb.Focus(FocusState.Programmatic);
    _secont_tb.Focus(FocusState.Programmatic);
    

    无论哪个有焦点,它都会放弃焦点并触发您需要的任何事件。

    作为替代方法,将焦点放在页面上任何位置的隐藏文本框。

    【讨论】:

    • 您不能将焦点设置在隐藏元素上。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多