Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定应用程序中的活动控件_C#_Winforms - Fatal编程技术网

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

C# 确定应用程序中的活动控件,c#,winforms,C#,Winforms,我目前正在开发一个具有多个窗体和对话框的应用程序。功能的一部分是功能区上的一组剪切、复制和粘贴按钮。到目前为止,我还无法编写处理剪切复制和粘贴操作的代码。我的问题如下: 在主窗体的Application.Idle事件中,我试图找出当前活动的控件,而不管当前活动的窗体(可能是主窗体、mdi子窗体或对话框)。经过多次尝试和错误后,这是我最成功的尝试: Form activeForm = Form.ActiveForm; Control activeControl = activeForm.Activ

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

在主窗体的Application.Idle事件中,我试图找出当前活动的控件,而不管当前活动的窗体(可能是主窗体、mdi子窗体或对话框)。经过多次尝试和错误后,这是我最成功的尝试:

Form activeForm = Form.ActiveForm;
Control activeControl = activeForm.ActiveControl;
这在大多数情况下都能很好地工作,但是当控件嵌入到容器(例如浮动dockpanel)中时,activeControl变量返回容器控件,而不是其上具有焦点的文本框

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


谢谢,Nick

我在一个包含两个控件的
GroupBox
表单上尝试了这一点,它按预期工作(但对于生产代码,您可能应该添加一些空检查,以防未选择任何内容,或者应用程序根本没有焦点):

Form-activeForm=Form.activeForm;
Control-activeControl=activeForm.activeControl;
while(activeControl.HasChildren)
{
activeControl=activeControl
.控制
.Cast()
.FirstOrDefault(c=>c.Focused);
}

另一方面,如果您使用的是第三方对接库(例如,您提到了DockPanel,因此我想到了DockPanel),那么您必须使用它们自己的属性(例如
DockPanel.ActiveDocument
DockPanel.ActiveContent
)获取停靠表单,但总体思路保持不变。

我会尝试一下。感谢您的及时回复!稍作修改后,它的效果非常好!再次感谢。
Form activeForm = Form.ActiveForm;
Control activeControl = activeForm.ActiveControl;
while (activeControl.HasChildren)
{
    activeControl = activeControl
        .Controls
        .Cast<Control>()
        .FirstOrDefault(c => c.Focused);
}