我想创建一个组件,允许我们使用与任意命令相关联的复合键盘快捷键,如Visual Studio IDE和Microsoft Office.
也就是说,键盘快捷键由一系列多次击键组成,例如Ctrl+ W+ C.在Visual Studio中,这将打开类视图.当按下第一组键(Ctrl+ W)时,按下"(Ctrl + W)消息.等待和弦的第二个键......"出现在状态栏中.
在具体回答键盘和弦的问题时,我不相信现在有一个现成的选项供您使用.
但是,它应该足够简单来建模.或许,我会创建一个单独的类KeyboardChordProvider
.它需要知道表单级别的键盘事件.如其他地方所述,Form.KeyPreview
财产必须是true
.这个提供者订阅该Form.KeyPress
事件可能就足够了.如果您传入表单,则可以在提供程序的构造函数中执行所有这些操作.
您需要向提供商注册潜在的击键.
在内部,此实例将跟踪当前状态.每当观察到表示和弦的第一个键的击键时,您将更新提供者的状态并引发事件,以便订阅者可以设置文本:(CTRL + W)被按下.等待和弦的第二把钥匙......
如果下一个击键与潜在的辅助选项匹配,那么您有一个匹配并且可以引发ChordPressed
包含所输入笔画细节的事件.或者,您可能只是调用在和弦注册时提供给提供者的特定回调(以避免在ChordPressed
事件处理程序中使用switch语句或其他一些调度).
如果在任何时候击键与潜在的下一个选项不匹配,那么您将重置提供者的状态.
在提供程序内部,您可以使用树结构对可能的击键进行建模.提供者的当前状态只是一个特定的树节点.开始时,根节点将处于活动状态.如果孩子匹配击键,那么它将成为预期下一个笔划的当前节点.如果孩子是一个叶子节点,那么整个和弦已匹配,你会引发ChordPressed
事件(传递让你到达那一点的笔画链)或调用存储在叶子中的回调.每当没有击键与孩子匹配时,重置回使根节点激活.
我认为这个设计可以达到你想要的效果.