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