我们正在使用 DevExpress BarManager 来构建我们的菜单,但我知道下面描述的问题也发生在其他菜单处理组件中:
我们在使用 BarManager 时遇到了一个概念问题。我们有一个基本的表单类,我们所有的表单都从该类派生而来。这个基本表单有一个 BarManager,事实上,它处理出现的每个快捷方式,包括通常由当前焦点控件处理的快捷方式。这当然不是期望的行为。考虑这个例子:如果一个文本框被聚焦,按 CTRL + C 不会导致文本框将其文本值复制到剪贴板。相反,BarManager 将触发 BarItemClick 事件。
现在我们已经评估了几种以通用方式解决这个问题的策略。我们显然要求我们的框架完全处理问题,并且个别程序员或应用程序不关心它。因此,以下示例中建议的解决方案不适用,因为它取决于特定于应用程序的逻辑:example。
我们发现基本上有两种方法可以通用地解决这个问题:
- BarManager 始终在 BarItemClick 事件处理程序中处理快捷方式。如果一个控件被聚焦,如果可能的话,该控件被告知要处理快捷方式。如果控件无法处理快捷方式(例如,因为快捷方式是 CTRL + S),BarManager 会将事件传递给应用程序(例如,将当前文档保存在 CTRL + S 上)。
- BarManager 有一个 ShortcutItemClick 事件,只要出现快捷方式,就会触发该事件。在相应的事件处理程序中,询问焦点控件是否可以处理此快捷方式。如果是(例如 CTRL + C),BarManager 将取消处理快捷方式,并且控件将对快捷方式做出反应,就好像根本没有 BarManager 一样(例如,将控件内容复制到剪贴板)。如果没有(例如 CTRL + S),BarManager 将处理快捷方式,这意味着它会触发其 BarItemClick 事件,这将导致应用程序处理它(例如保存当前文档)。
现在,对于每个解决方案,我们都有几个想法,但它们的实现方式都不是令人满意的:
对于解决方案 1:
A) 在焦点控件上调用 BaseEdit.SendKey()。这将是最独立的解决方案,因为没有要实现的逻辑。问题是:调用 BaseEdit.SendKey() 并传递快捷键的键没有效果。例如 SendKey(new KeyEventArgs(Keys.Delete)) 不会删除焦点文本框的选择。我的问题是:为什么这个方法调用没有效果?
B) 定义一个接口 IShortcutHandler,它有一个方法 HandleShortcut()。所有使用的控件都通过以下方式实现接口:
public void HandleShortcut(KeyEventArgs args)
{
base.OnKeyDown(args);
}
这个方案也有调用OnKeyDown没有效果的问题,和A)一样。我的问题是:为什么会这样?
对于解决方案 2:
A) 调用控件上的方法,确定控件是否能够处理快捷方式。我的问题是:是否有这样的方法或帮助类或库或任何可以做出决定的东西?
您还有其他可以想到的策略或解决方案吗?