设置窗体的所有者,使该窗体作为非模式窗口保持在其所有者之上。
如果拥有的Form 的ShowInTaskbar
属性设置为true
,则用于在系统中迭代打开的 Windows 的标准键ALT+TAB
或WIN+TAB
键组合将显示(激活)下一个拥有的 Form 而不是 Owner。
激活哪个子窗体,取决于窗体在任务栏中的当前位置。
如果ShowInTaskbar
子项的属性设置为false
,则激活所有者表单。
需要注意的是,如果可以最小化子窗体,可以观察到一些尴尬的行为:Alt 或 Control-tabbing,导致子窗体以不愉快的方式出现和消失。
无论如何,可以使用标准组合CONTROL+F6
键将焦点移到打开的子窗体(以及在这种布局中的所有者窗体)上,如果需要(如果窗体最小化),也可以将它们放在前面。
在这里,覆盖ProcessCmdKey ,因此无论哪个子控件捕获了光标 ,都会拦截键的组合。
此处的代码激活一个同时按下CONTROL+F6
和的表单CONTROL+SHIFT+F6
,将焦点移动到每个打开的子表单和所有者。当最小化子表单(或所有子表单)时,它也可以工作。
在所有者表格中:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool isControlF6 = keyData == (Keys.Control | Keys.F6);
bool isCtrlShiftF6 = keyData == (Keys.Control | Keys.Shift | Keys.F6);
if (isControlF6 || isCtrlShiftF6)
{
Form frm = isCtrlShiftF6
? Application.OpenForms.OfType<Form>().LastOrDefault(f => f.Owner == this)
: Application.OpenForms.OfType<Form>().FirstOrDefault(f => f.Owner == this);
if (frm is null) return true;
frm.WindowState = FormWindowState.Normal;
frm.Focus();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
在子窗体中:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool isControlF6 = keyData == (Keys.Control | Keys.F6);
bool isCtrlShiftF6 = keyData == (Keys.Control | Keys.Shift | Keys.F6);
if (isControlF6 || isCtrlShiftF6) {
int frmNext = 0;
var formsList = Application.OpenForms.OfType<Form>()
.Where(f => (f.Owner == this.Owner) || (f == this.Owner)).ToList();
for (int i = 0; i < formsList.Count; i++) {
if (formsList[i] == this) {
if (isCtrlShiftF6) { frmNext = i == 0 ? formsList.Count - 1 : i - 1; }
if (isControlF6) { frmNext = i == formsList.Count - 1 ? 0 : i + 1; }
formsList[frmNext].WindowState = FormWindowState.Normal;
formsList[frmNext].Focus();
return true;
}
}
}
return base.ProcessCmdKey(ref msg, keyData);
}