- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在我的 MDI 父窗体类中覆盖了 ProcessCmdKey() 并且在同一个类中有一些键盘快捷键调用方法。但我希望让这些热键以父/子形式和其他形式工作。现在的情况是当专注于其他形式(常规形式,而不是 MDI)时,ProcessCmdKey() 不再捕获键盘。我应该把 ProcessCmdKey() 放在哪个类中以及让它工作的任何东西?谢谢!
namespace myNamespace
{
public class MDIParent : System.Windows.Forms.Form
{
public bool NextTab(){...}
public bool PreviousTab(){...}
protected override bool ProcessCmdKey(ref Message message, Keys keys)
{
switch (keys)
{
case Keys.Control | Keys.Tab:
NextTab();
return true;
case Keys.Control | Keys.Shift | Keys.Tab:
PreviousTab();
return true;
}
return base.ProcessCmdKey(ref message, keys);
}
}
public class mySecondForm : System.Windows.Forms.Form
{
...
}
}
最佳答案
您可以使用实现的 ProcessCmdKey 处理程序定义一个“基本”表单,然后创建所有其他表单:MDI 父级、MDI 父级的子窗口以及您创建的任何“独立”表单(即不是子级) MDI 窗体的)继承自“基本窗体”。只需确保在您希望成为 MDI 的窗体上设置了 IsMdiContainer 属性,并且您添加到 MDI 窗体的子窗口不是 TopLevel 并且将它们的父窗口设置为 MDI 窗体。
那么问题是,你想在哪里处理由你启用的组合键触发的事件,因为......如果你定义由基本表单中的捕获组合键触发的方法......每个从基础 Form 继承的 Form 将在它们自己的上下文中执行它们。
如果您想在应用程序范围内处理捕获的组合键,那么可以实现一个静态公共(public)类,其中的组合键处理程序定义为静态方法。或者,由于您可能想知道从哪个表单发出的特殊组合键,只需将调用表单的指针传递给静态处理程序。
因此,您在基本表单中 ProcessCmdKey 覆盖中的控件 + Tab 处理程序可能如下所示:
// in ProcessCmdKey override in base Form
case Keys.Control | Keys.Tab:
KeyHandler.NextTabHandler(this);
return true;
你的静态类可能看起来像这样:
public static class KeyHandler
{
public static void NextTabHandler(Form theCallingForm)
{
Console.WriteLine("called from : " + theCallingForm.Text + " : ActiveControl : " + theCallingForm.ActiveControl.Name);
if (theCallingForm is MDIForm)
{
// handle Next Tab on MDIForm control
}
else if (theCallingForm is childForm)
{
// handle Next Tab on ChildForm control
}
else
{
if(theCallingForm is independentForm)
{
// handle Next Tab on "independent Form" control
}
}
}
}
正如您在上面的代码中看到的,您可以使用调用 Form 的 ActiveControl 属性来了解给定类型的 Form 上的哪个控件获得了组合键。
当然,如果您不想像这样“全局”处理组合键,只需根据需要在其他表单中插入您的 ProcessCmdKey 覆盖,并且不要让它们从基本表单继承.
在“应用程序范围内”处理关键事件可能是也可能不是您特定解决方案的最佳策略,但它是一个可行的策略。最好的,
关于c# - 尝试使用ProcessCmdKey在MDI父/子窗体和其他窗体中实现全局快捷键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1704953/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在开发一个 .NET C# 应用程序,它有一个主窗体,它是 MDI 容器。当用户最大化 MDI 子项时,Windows 会在容器窗体的标题栏下方绘制一个控制条,其中包含子项的图标和右侧的系统按钮。
我有一个用 Delphi 2006 编写的 MDI 应用程序,它以默认主题运行 XP。 有没有办法控制 MDI 子项的外观以避免每个窗口上出现 XP 风格的大标题栏? 我尝试将 MDIChildren
我有一个包含面板的 MDI 父窗体。该面板包括图表和一些其他用户信息。当我从菜单中打开一个窗体时,新打开的窗体显示在 MDI 父面板下。如何显示所有 MDI 父控件上方的子窗体。我正在使用以下代码打开
我有一个 MDI 父窗体,它在运行时创建许多 MDI 子窗体。有没有一种聪明的方法可以在父级内部平均分配这些表格?有什么想法吗? 提前致谢! 最佳答案 **ArrangeIcons** chi
我想知道如何加载子表单,使其大小覆盖整个 MDI 父级的 MDI 容器空间(深灰色的东西)?将子窗体的 WindowState 设置为最大化不是一个选项,因为它也会最大化任何其他窗体。有建议吗? 最佳
我已经创建了一个父表单并为此引发了 ControlAdded 事件。并且还将此父窗体的属性 IsMdiContainer 设置为 true。然后,如果我创建一个名为 ChildForm1 和 Chil
我希望 MDI 父级自动调整子窗体的大小,使其在没有滚动条的情况下适合内部。有人可以提供一些代码吗? 我用它来区分父项和子项的大小,并将其添加到父项的大小,这样我就可以合身了。但它太手动了,制作时间太
我正在打开另一个 MDI 子窗体的 MDI 子窗体,它正在工作,但现在我必须以相同的方式关闭它,但没有任何反应。 这是我正在使用的代码示例: private void checkbox1_Checke
是否可以这样做,如果可以,怎么做? 我的应用程序的屏幕截图 最佳答案 您需要设置 AllowMerge property MenuStrip 的 false。 这将使子窗体上的 MenuStrip 保
我有一个带有多个子项的 MDI 表单,当我最大化一个 MDI 子项时,它会自动最大化所有子项。 我不想使用设置最大大小或设置最小大小属性。有什么办法可以防止mdi child 的这种行为吗? 最佳答案
我正在制作一个小型企业应用程序,我想知道最好的界面是什么。该应用程序本身就是您的普通服务票务跟踪器。将有用于搜索工单(带有结果网格)、创建新的勾选和查看现有工单、管理一些管理内容(用户、一些分类器等)
您好,我想打开来自 MDI Parent 的表格。 如果 For 已经打开,那么它应该被激活或打开新表格..现在我正在使用 foreach 循环。但我不想使用循环。 foreach (Form frm
我有一个 MDI 主窗体,一个显示子窗体的菜单项(我们称它为 frmEmployees),在这个窗体中有一个 Button (btnNew...) , 我如何从这里打开一个对话框 (frmNewEmp
我试图在 MDI 父级上检测我的 MDI 子级窗体何时关闭,并做出相应的 react 。在 MDI 子级关闭之前,MDI 父级不应执行任何操作。这是我的代码,我不确定我做错了什么,但是我添加的表单关闭
如何在正常创建的 MDI 窗口窗体中显示 WPF 窗体。 我们将表单创建为 MDI。增加菜单栏点击菜单会在主容器MDi窗体中显示wpf窗体。 private void newStudentToolS
我在子表单中有一个值(let CompanyId)。我想在 MDI 父窗体的级别中传递此值。 在子窗体中,我在数据 GridView 中从数据库中检索数据。现在我从数据 GridView 中选择一个值
我有一个带有此 FormClosing 事件处理程序的 MDI 父级: private void FrmMdiParent_FormClosing(object sender, FormClosing
有没有办法从用 Delphi 5 编写的 ActiveX dll 创建 MDI 子窗口,并将其嵌入到从 Delphi XE Windows 客户端应用程序创建的 MDI 父窗口中?如果没有,有没有办法
这个问题之前已经发布过,但我找不到一个好的答案。 我想在我的 WPF 应用程序中使用 MDI 子级。我希望这些 child 完全符合 WPF。 .Net WPF 不再有 MDI 子项(主窗口中的窗口)
我是一名优秀的程序员,十分优秀!