确定应用程序中的活动控件

时间:2013-09-06 10:55:06

标签: c# winforms

我目前正在开发一个具有多个表单和对话框的应用程序。部分功能是功能区上的一组剪切,复制和粘贴按钮。到目前为止,我还没有能够编写处理剪切复制和粘贴操作的代码。我的问题如下:

在我的主窗体的Application.Idle事件中,我试图弄清楚当前活动的控件,无论当前活动的窗体(可能是主窗体,mdi子窗口或对话框)。反复试验,这是我最成功的尝试:

Form activeForm = Form.ActiveForm;
Control activeControl = activeForm.ActiveControl;

这适用于大多数情况,但是当控件嵌入容器(例如浮动dockpanel)时,activeControl变量返回容器控件,而不是其上具有焦点的文本框。

我在这里遗漏了什么吗?是否有更好的方法来实现此功能?

谢谢,尼克

1 个答案:

答案 0 :(得分:0)

我在包含几个控件的GroupBox的表单上尝试了这个,并且它按预期工作(但对于生产代码,如果没有选择任何内容,或者应用程序没有,则应该添加一些空值检查总而言之:)

Form activeForm = Form.ActiveForm;
Control activeControl = activeForm.ActiveControl;
while (activeControl.HasChildren)
{
    activeControl = activeControl
        .Controls
        .Cast<Control>()
        .FirstOrDefault(c => c.Focused);
}

另一方面,如果您使用的是第三方停靠库(例如,您提到了DockPanel,我想的是Weifen Luo's DockPanel Suite),那么您将不得不使用自己的属性(例如{ {1}}或DockPanel.ActiveDocument)获取停靠表单,但总体思路保持不变。