首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Keyboard.Focus不适用于WPF中的文本框

Keyboard.Focus不适用于WPF中的文本框
EN

Stack Overflow用户
提问于 2012-12-19 23:12:51
回答 4查看 22.5K关注 0票数 24

我正在wpf中解决一个看起来如此简单的问题,但我还没有发现为什么我的应用程序不能按照我的计划运行。

我有一个小的搜索框,当用户按下ctrl+f时,它会在我的wpf应用程序中弹出。我想要的是在搜索框文本框中闪现插入符号,准备接受用户输入的任何内容,而用户不必单击它。下面是文本框的xaml代码,它是可见的、可启用的、可命中的、可测试的、可制表位的和可聚焦的。

   <TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" />

在后面的代码中,当搜索框的可见性受到影响时,我调用了这个方法。搜索框在应用程序开始时加载。

    /// <summary>
    /// Handles events triggered from focusing on this view.
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="dependencyPropertyChangedEventArgs">The key event args.</param>
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        if (!((bool) dependencyPropertyChangedEventArgs.NewValue))
        {
            return;
        }

        SearchCriteriaTextBox.Focus();
        Keyboard.Focus(SearchCriteriaTextBox);
        SearchCriteriaTextBox.Select(0, 0);

        if (SearchCriteriaTextBox.Text.Length > 0)
        {
            SearchCriteriaTextBox.SelectAll();
        }
    }

问题是,代码被调用了,组件变成了IsFocused=true,但没有获得键盘焦点。我是不是遗漏了什么?除非另一个控件强烈地保持键盘焦点,我非常确定我没有编码,否则为什么这段相当简单的代码不能正常工作。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-19 23:31:35

作为一种解决办法,您可以尝试使用Dispatcher在以后的DispatcherPriority (如Input )中设置焦点

Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { 
        SearchCriteriaTextBox.Focus();         // Set Logical Focus
        Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus
     }));

从您的问题描述来看,听起来您没有键盘焦点集。WPF可以有多个焦点作用域,因此多个元素可以有逻辑焦点(IsFocused = true),但是只有一个元素可以有键盘焦点并接受键盘输入。

您发布的代码应该正确设置焦点,因此必须在之后进行某些操作以将键盘焦点移出您的TextBox。通过将焦点设置为稍后的dispatcher优先级,您将确保在SearchCriteriaTextBox上设置键盘焦点是最后完成的。

票数 72
EN

Stack Overflow用户

发布于 2019-09-29 13:34:03

基于瑞秋的解决方案,有一种更简单的方法。

在XAML中添加到TextBox Loaded="Got_Loaded“

在后台代码中

    private void Got_Loaded(object sender, RoutedEventArgs e)
    {
        Keyboard.Focus(((TextBox)sender));
    }
票数 2
EN

Stack Overflow用户

发布于 2017-09-04 22:36:26

如果这对任何人有帮助的话,我就遇到了这个问题,我的应用程序有一个主窗口,其中包含多个用户控件,这些控件通过可见性数据绑定放在不同的网格中。因为在构建应用程序时网格就在那里,所以在构建时调用.Focus(),或者在构建时调用构造函数,而不是在可见时调用。

无论如何,我通过在网格的MouseEnter事件上调用.Focus()来修复它。对我来说很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13955340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档