winform 同时打开多个窗体,获取当前操作(Active)的窗体.
最近工作项目中使用winform开发时碰到这样一种场景,同时打开了多个Form页面且没有隐藏Hide(),需要获取当前正在操作Avtive的页面,在被窗体调用的控件中可以使用This.ParentForm获取,但如果是普通功能类则无法使用这种方式获取,使用Form窗体静态属性Form.ActiveForm直接取值,不止为何为Null,。
于是从应用程序管理的Application.OpenForms属性着手,类型为FormCollection,储存所有打开未关闭的From窗体(包含Hide()隐藏的窗体)。遍历form调用属性发现没有Active公开属性可以调用,于是尝试了Visible/Canfocus/Enabled/CanSelect/ContainsFocus几个bool属性,看能否判断出当前ActiveForm,调试发现Hide()的窗体除了Enabled=true,其他4个Boo均为False,与之相反,未隐藏的所有打开窗体则Visible/Canfocus/Enabled/CanSelect属性值均为True, 对于当前操作的打开窗体则还有ContainsFocus属性为True,所有通过ContainsFocus可以区分所有打开的窗体中的当前选中的Active窗体。代码如下:
1 Form activeForm= null; 2 foreach (Form item in Application.OpenForms) 3 { 4 if (item.ContainsFocus) 5 { //当前活动窗体 6 activeForm= item; 7 break; 8 } 9 }