WPF:无法设置焦点

Posted

技术标签:

【中文标题】WPF:无法设置焦点【英文标题】:WPF: Cannot set focus 【发布时间】:2010-11-26 14:57:12 【问题描述】:

我希望从 PreviewTextInput 处理程序中创建一个新控件并将焦点设置为它。但即使在新控件上调用 Focus() 后,光标仍位于旧文本框中。 处理程序 UserControl_PreviewTextInput 已在包含此文本框的 UserControl 上注册(如果这很重要)。

private void UserControl_PreviewTextInput(object sender, TextCompositionEventArgs e)

            CodeLineControl el = new CodeLineControl();
            container.Children.Insert(idx+1, el);
            el.innerTextBox.Focus();

CodeLineControl 是这样定义的(简化):

<UserControl ..>
    <DockPanel Name="codeline"  Background="AntiqueWhite" >           
         <TextBox Name="innerTextBox"/>      
    </DockPanel>  
</UserControl>

Focus() 是否有一些我不知道的限制?我是否不允许将 Focus() 从 PreviewTextInput 处理程序中的 TextBox 移开?我不能将焦点设置在新创建的元素上吗?

【问题讨论】:

【参考方案1】:

这是我用来代替 Focus 的扩展方法:

    public static void BackgroundFocus(this UIElement el)
    
        Action a = () => el.Focus();
        el.Dispatcher.BeginInvoke(DispatcherPriority.Background, a);
    

无需创建计时器。

【讨论】:

我偷了你的密码!我重命名为FocusLikeChuckNorris! (+1)【参考方案2】:

创建一个 DispatcherTimer,在延迟后对该文本框调用 Focus

【讨论】:

为什么需要这个?我将新控件添加到 gui,因此它应该是可见且可聚焦的。 我认为它是在一个单独的线程中异步呈现的,在完成之前你不能专注于它。或者,可能是在添加新控件后,WPF 会更改焦点本身。也许 LostFocus 事件在某个时候被触发?您可以编写一个日志文件来查看哪些控件正在获得/失去焦点。 julmar.com/blog/mark/…

以上是关于WPF:无法设置焦点的主要内容,如果未能解决你的问题,请参考以下文章

WPF强制设置TextBox的焦点

WPF 复合控件焦点设置

wpf datagrid cell 设置焦点

在 WPF 中的文本框上设置焦点

WPF设置控件获得焦点FocusManager

将焦点设置在WPF中的文本框中