【发布时间】:2019-02-24 17:02:54
【问题描述】:
我有一个带有两个子无模式表单的主表单,例如所有表单都可以同时激活:
class MainForm : Form
{
Form child1;
Form child2;
public MainForm()
{
Text = "MainForm";
child1 = new Form { Text = "Child1" };
child2 = new Form { Text = "Child2" };
child1.Show(this);
child2.Show(this);
}
}
我想允许用户Alt+Tab 进入所有这些表单,但令人惊讶的是,我发现如果任何子表单处于活动状态,则无法从Alt+Tab 菜单中选择所有者表单。
所有三个表单都显示在列表中,但显然当您选择所有者窗口并且有一个活动的子窗口时,选择的是子窗口而不是所有者。在任务栏中选择表单时也会发生同样的情况。
我错过了什么吗?我开始考虑显式配置快捷键以允许从无模式子窗体导航到所有者窗口,但在此之前我想确认是否已经有一些内置键盘快捷键可以执行此操作,因为我不想打破用户的期望。
令人惊讶的是,我找不到任何提到这种行为的问题,我也觉得这很奇怪。
【问题讨论】:
-
您是否设置了所有者 (
.Show(this);) 以便新表单保持在其顶部?如果这是所需的行为,那么您将得到您所要求的。如果您不想要这种行为,请不要设置所有者。 -
我相信我在文本中包含的代码 sn-p 解决了您的第一个问题。关于“你得到你想要的”的评论,你能详细说明一下吗?既然 modeless 对话框都可以用鼠标独立激活,为什么不能用键盘独立激活呢?在我看来,这是一个明显的可访问性问题(即无法访问键盘或不可见的用户无法访问表单)。
-
您可以随时覆盖
ProcessCmdKey,检查用户是否按下了CTRL + F6,并将焦点传递给所有者:this.Owner.Focus()。您当然可以使用任何组合或单个键,这只是默认设置。当你 ALT + TAB 时,孩子在它的所有者之上,所以它是接收焦点的窗口。 -
是的,我怀疑我必须为此设置自己的快捷键机制。请问为什么
CTRL+F6?这是从子窗口移动到其所有者的 Windows 标准/建议吗?我之所以这么问,是因为重要的是要知道有经验的 Windows 用户是否会期待这一点,或者这是否是必须明确教授的内容。 -
好吧,在 Visual Studio 中,打开一些文件并按
Ctrl+F6,你会看到。其他程序也一样。这是将焦点移动到不同子窗口(或所有者的)的默认快捷方式。
标签: c# winforms keyboard-shortcuts alt-tab modeless-dialog