.net - 在 WinForms 应用程序中找到焦点控件的首选方法是什么?

标签 .net winforms

在 WinForms 中查找当前正在接收用户(键盘)输入的控件的首选/最简单方法是什么?

到目前为止,我已经提出了以下内容:

public static Control FindFocusedControl(Control control)
{
    var container = control as ContainerControl;
    return (null != container
        ? FindFocusedControl(container.ActiveControl)
        : control);
}

从表单中,可以简单地调用它(在 .NET 3.5+ 中,甚至可以将其定义为表单上的扩展方法)-

var focused = FindFocusedControl(this);

这样合适吗?

是否有我应该使用的内置方法?

请注意,当使用层次结构时,对 ActiveControl 的一次调用是不够的。想象一下:

Form
    TableLayoutPanel
        FlowLayoutPanel
            TextBox (focused)

(formInstance).ActiveControl 将返回对 TableLayoutPanel 的引用,而不是 TextBox(因为 ActiveControl 似乎只返回控件树中的直接事件子级,而我正在寻找叶控件)。

最佳答案

如果您已经有其他对 Windows API 的调用,那么使用 Peters 解决方案没有什么坏处。但我理解您对此的担忧,并且会倾向于与您类似的解决方案,仅使用框架功能。毕竟,性能差异(如果有的话)应该不会很大。

我会采取非递归方法:

public static Control FindFocusedControl(Control control)
{
    var container = control as IContainerControl;
    while (container != null)
    {
        control = container.ActiveControl;
        container = control as IContainerControl;
    }
    return control;
}

关于.net - 在 WinForms 应用程序中找到焦点控件的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/435433/

相关文章:

c# - 在 C# 中使用 .Show() 方法后,由于循环而导致对话框无法正确显示

c# - 我的列表 <> 返回找到的文件的确切数量,但在整个循环中显示相同的数据

c# - 如何为非数据库操作实现类似事务的行为?

c# - 从资源文件读取 Cursor 时抛出 ArgumentException

c# - 我应该在 Windows 窗体项目中使用数据绑定(bind)吗?

winforms - WiX 项目 :- how to reduce EXE(Bootstapper) size

c# - 使用类将数据存储到列表中

c# - 如何通过 REST API 发送文件?

c# - WeakReference 返回错误的对象

.net - 设计器中的属性更改未在设计器文件中更新 - Windows 窗体