在 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/