C# 键盘赢了';即使在焦点改变后也不要放弃

C# 键盘赢了';即使在焦点改变后也不要放弃,c#,windows,xaml,C#,Windows,Xaml,我正在创建一个Windows8.1应用程序,当用户按下一个按钮后,屏幕上的大部分区域都会弹出一个窗口。popover中有几个文本框 我找到了微软关于如何检测屏幕键盘外观的示例代码 我还发现以下帖子和网站基本上告诉我们没有办法强制关闭键盘,而正确的做法实际上是通过编程将隐藏元素集中在页面上,或者禁用然后重新启用文本框: 所以我按照建议做了一个隐形按钮。当用户点击“关闭”按钮时,应该将焦点对准该按钮并关闭键盘。发生的情况是文本框会失去焦点,但键盘不会消失。如果我使关闭按钮聚焦隐藏按钮并关

我正在创建一个Windows8.1应用程序,当用户按下一个按钮后,屏幕上的大部分区域都会弹出一个窗口。popover中有几个文本框

我找到了微软关于如何检测屏幕键盘外观的示例代码

我还发现以下帖子和网站基本上告诉我们没有办法强制关闭键盘,而正确的做法实际上是通过编程将隐藏元素集中在页面上,或者禁用然后重新启用文本框:

所以我按照建议做了一个隐形按钮。当用户点击“关闭”按钮时,应该将焦点对准该按钮并关闭键盘。发生的情况是文本框会失去焦点,但键盘不会消失。如果我使关闭按钮聚焦隐藏按钮并关闭弹出窗口(这是所需的效果),则键盘不会消失,直到点击视图(之前在弹出窗口下)

如何使关闭弹出窗口导致键盘关闭


编辑:似乎有一种方法可以通过编程关闭键盘,因为在键盘打开时触发应用程序栏打开会自动关闭键盘。

当显示虚拟键盘的文本框被禁用时,它将关闭虚拟键盘。因此,解决方案将textbox属性IsEnabled设置为false,并再次将其设置为true,以便再次使用

TextBox.KeyDown += (s, a) => {
 if (a.Key == VirtualKey.Enter) {
   TextBox.IsEnabled = false;
   TextBox.IsEnabled = true;
 }

请检查我对自己问题的回答:


基于@Paul的回答。不是很优雅,但很有魅力。

不可能通过编程来管理触摸键盘的外观和消失。不幸的是,更改
IsEnabled
属性对我来说不起作用

触摸键盘的外观原理被称为焦点驱动,但我通过在
UserControl
上明确设置属性
IsTabStop=True
退出了。此外,如果触摸键盘的
IsTabStop=false
,则
文本框将不会激活触摸键盘

理论上,我认为系统会搜索下一个潜在的
文本框
, 所以,如果是这样的话,它不会关闭和重新打开 可触摸+可输入属性。也许有一种bug,当发布
焦点时,当前的
文本框只发布他的
“可触摸”焦点,未完成释放键盘的
“可输入”焦点,因为默认情况下只有输入控件
具有可停止特性

顺便说一句,如果我们通过
CustomControl
的关闭按钮关闭
UserControl
,则其父项上需要
IsTabStop=true


备注:解决方案仅在Windows 8.1应用商店应用程序上进行了测试。

在我的应用程序中,这可以正常工作:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    this.KeyDown += Strona_KeyDown;
}

private void Strona_KeyDown(object sender, KeyRoutedEventArgs e)
{
    if (e.Key == Windows.System.VirtualKey.Enter)
    {
        this.Focus(FocusState.Pointer);
    }
}

在UWP Windows 10中,简单的禁用/启用不再起作用。但这是可行的:

            TextBox.IsEnabled = false;

            var t = new DispatcherTimer();
            t.Interval = new TimeSpan(0, 0, 1);
            t.Tick += (a, b) =>
            {
                t.Stop();
                TextBox.IsEnabled = true;
            };
            t.Start();

找到更优雅的解决方案?请分享。

在Windows Phone 8.1 WinRT中起到了魔力般的作用(当然,父容器上的Focus()不起作用)。谢谢你,保罗!效果很好,不过我想要更干净的解决方案…:(