C#WinForms键绑定

时间:2015-05-31 21:13:07

标签: java c# winforms swing

C#中最接近Java的KeyBindings是什么?我试图将Swing应用程序移植到C#,但不清楚我应该使用哪种方法。 以下是我正在移植的Java示例:

Action goUp = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        panel.upPressed = true;
    }
};

Action stopUp = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        panel.upPressed = false;
    }
};

InputMap getInputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

getInputMap.put(KeyStroke.getKeyStroke("W"), "goUp");
getInputMap.put(KeyStroke.getKeyStroke("released W"), "stopUp");

panel.getActionMap().put("goUp", goUp);
panel.getActionMap().put("stopUp", stopUp);

1 个答案:

答案 0 :(得分:2)

在Winforms中,我不知道任何与InputMap完全相同的内容。键盘输入通常以两种方式之一处理:

  1. 快捷键,即MenuItem.Shortcut。这可以在Designer中或代码中分配。按相关键将调用菜单项的Click事件处理程序。当然,要使用此方法,您需要将要执行的操作在UI中表示为菜单项。
  2. UI中的各种关键事件处理。根据您的需要,这可能会变得相当复杂,但通常是最合适的方式,并且是处理与菜单项无关的键输入的主要方式。最简单的事件是KeyPress事件。根据您的示例,您可能希望处理KeyDownKeyUp,以便您可以跟踪密钥的实际状态。请注意,您将收到多个KeyDown个事件,因为自动重复启动密钥;如果这对您的处理程序来说是一个问题,那么您需要跟踪关键状态以及您已经看过的关键字KeyDown,如果您已经看过,则只处理KeyDown事件相应的KeyUp事件。
  3. 请注意,WPF确实具有与InputMap更相似的键绑定模型。当然,语法完全不同,但它分离了菜单项,命令和键绑定的概念,因此您可以根据需要进行混合和匹配(特别是,具有与任何菜单不对应的键绑定)项目)。因此,如果使用WPF是一个选项,您可能会发现转换的一部分更容易(可能只有那部分,因为Swing更像是Winforms而不是WPF :)。