web-dev-qa-db-ja.com

MenuItemショートカットの定義

メニュー項目のショートカットを設定する簡単な方法が必要です。

しかし、これはショートカットでは機能せず、クリックするだけで機能します。

<MenuItem Header="Editar">
    <MenuItem Header="Procurar" Name="MenuProcurar"
              InputGestureText="Ctrl+F"
              Click="MenuProcurar_Click">
        <MenuItem.ToolTip>
            <ToolTip>
                Procurar
            </ToolTip>
        </MenuItem.ToolTip>
    </MenuItem>
</MenuItem>

WPF 4.0を使用しています

46

H.B.正しかった...精度を追加したかっただけです。

ClickMenuItemイベントを削除し、代わりにCommandに関連付けます。

1-コマンドを追加/作成します:

<Window.CommandBindings>
     <CommandBinding Command="Open" Executed="OpenCommandBinding_Executed"/>
     <CommandBinding Command="SaveAs" Executed="SaveAsCommandBinding_Executed"/>
</Window.CommandBindings>

コマンドは次のコードを参照しています。

private void OpenCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    Open();//Implementation of open file
}
private void SaveAsCommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    SaveAs();//Implementation of saveAs
}

2-コマンドを必要なキーに関連付けます。

<Window.InputBindings>
    <KeyBinding Key="O" Modifiers="Control" Command="Open"/>
    <KeyBinding Key="S" Modifiers="Control" Command="SaveAs"/>
</Window.InputBindings>

3-最後にコマンドをメニュー項目に割り当てます(InputGestureTextは単なる装飾テキストです):

<Menu Name="menu1">
    <MenuItem Header="_File">
        <MenuItem Name="menuOpen" Header="_Open..." Command="Open" InputGestureText="Ctrl+O"/>
        <MenuItem Name="menuSaveAs" Header="_Save as..." Command="SaveAs" InputGestureText="Ctrl+S"/>
    </MenuItem>
</Menu>

そのようにして、複数の入力を同じコマンドに関連付けることができます。

57
Guish

私の謙虚な意見では、ヘッダーで_を使用する方がはるかに簡単です。これにより、目的のホットキーが自動的に作成されます。

例えば:

<MenuItem Header="_Editar">
<MenuItem Header="_Procurar" Name="MenuProcurar"
          InputGestureText="Ctrl+F"
          Click="MenuProcurar_Click">
    <MenuItem.ToolTip>
        <ToolTip>
            Procurar
        </ToolTip>
    </MenuItem.ToolTip>
</MenuItem>
</MenuItem>
11

XAMLでRoutedUICommandを宣言することもできます。

<Window.Resources>
    <RoutedUICommand x:Key="BuildCmd" Text="Build">
        <RoutedUICommand.InputGestures>
            <KeyGesture>CTRL+SHIFT+B</KeyGesture>
        </RoutedUICommand.InputGestures>
    </RoutedUICommand>      
</Window.Resources>

バインディングを行う

<Window.CommandBindings>
    <CommandBinding Command="{StaticResource BuildCmd}" Executed="BuildCmdExecuted"/>
</Window.CommandBindings>

そして、MenuItem

<MenuItem Command="{StaticResource BuildCmd}"/>

別の解決策について説明します here

8
Eliko

Windows.Forms&gulpVB 6なので、私は Jonathanに同意Jase 必ずしもCommandBindingsであるとは限らないイベントハンドラーを静的に接続するための、より簡単で手続き的な方法が必要だということです。

このような、_CommandBinding以外のハンドラーを使用するための良いチュートリアルですが、ボタンに重点を置いて、 このMSDNブログ投稿 で見つけることができます。蒸留してMenuItemsをターゲットにします...

ICommandの作成

まず、ICommandを実装するクラスを作成します。もちろん、必要に応じてMainWindow.xaml.csファイルのどこにでもこれを配置して、デモコードを非常にシンプルに保つことができます。後でメニュー項目を無効/有効/有効にしたい場合は、おそらくCanExecuteをより複雑にしたいと思うでしょうが、現時点では、常にメニュー項目を有効にします。

_public class HelloWorldCommand : ICommand
{
    public void Execute(object parameter)
    {
        MessageBox.Show(@"""Hello, world!"" from " 
            + (parameter ?? "somewhere secret").ToString());
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
} 
_

チュートリアルが有用に指摘しているように、次のようなコードを使用して、すでにどこからでもこのコマンドを呼び出すことができます...

_var hwc = new HelloWorldCommand();
if (hwc.CanExecute(this))
    hwc.Execute(this);
_

ウィンドウでコマンドを宣言する

HelloWorldCommandの一種の「宣言」をWindowに追加して、後で使用できるようにします。 Windowタグ内で、コマンドをリソースとして登録します。

_<Window.Resources>
    <local:HelloWorldCommand x:Key="hwc"/>
</Window.Resources>
_

これで、この「ローカルに名前空間化された」コマンド_"hwc"_にリンクするための適切なショートカットができました。ただし、明らかに任意の文字列を使用できます。これをxamlで多く使用します。

コマンドの配線(および再利用!)

MenuItemsをxamlに追加しましょう。ストックGridDockPanelに置き換えました。これは、Windowを埋める等間隔のウィジェットを作成する最も簡単な方法だからです。私のUIの残りのすべて。

MenuItem宣言に散在する_Command="{StaticResource hwc}"_ sに注意してください。キーは、hwcです。これは、で設定したHelloWorldCommandのショートカットです。 Windowレベル。そして、もちろん、StaticResourceは、単にWindowのリソースを検索するように言っています。私たちは何も拘束していません。ショートカットを使用しています。

_<DockPanel LastChildFill="True">
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="_File">
            <MenuItem 
                Header="_Open" 
                Command="{StaticResource hwc}" 
            >
                <MenuItem.CommandParameter>
                    <!-- so you could make this object as complex as you wanted, 
                        like, say, your entire Window. See magic incantation, below. -->
                    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}" />
                </MenuItem.CommandParameter>

            </MenuItem>

            <MenuItem 
                Header="_Close" 
                Command="{StaticResource hwc}" 
                CommandParameter="Close"
                InputGestureText="Ctrl+G" />

            <MenuItem 
                Header="_Save" 
                Command="{StaticResource hwc}" 
                CommandParameter="Save" />

            <Separator />

            <MenuItem 
                Header="_Quit" 
                Command="{StaticResource hwc}" 
                CommandParameter="Quit" />
        </MenuItem>
</DockPanel>
_

イベントソースを区別するためのCommandParameters

すべてに同じコマンドを使用していることに注意してください!しかし、どのウィジェットがイベントをスローしたかをどのように確認できますか?そのためには、CommandParameterを使用する必要があります-ExecuteメソッドのシグネチャExecute(object parameter)を覚えておいてください。そのCommandParameterパラメーターは、イベントの処理方法を知るために使用できるものです。これを実行してみて、MessageBoxCommandParameterにあるものを使用してイベントのソースを知らせることに注意してください。すべて手動で行っていますが、それほど悪くはありません。

また、これらのオブジェクトを好きなだけ複雑にすることができることに注意してください。 MenuItemタグのプロパティを使用してパラメーターを定義するか、上記の[開く]メニュー項目のように「実際の」_<MenuItem.CommandParameter>_タグを使用して複雑なものを定義できます。この場合、Window objectを渡します。 VB6-ishコンテキストをイベントハンドラーコードにスローする最も簡単な(ただし、最もクリーンではない)方法でした。

キーボードショートカットをMenuItemsに追加(別名、「OPに応答」)

そして、ついに元の質問に答えることができます!最後に、Closeメニュー項目のキーボードショートカットを作成しましょう。すでにInputGestureTextを宣言していることに注意してください。それ自体では、InputGestureTextは単なる化粧品です。過度にうるさい場合、キーボードショートカットを作成するメカニズムには、MenuItemとの直接的な固有の関係はまったくないと主張できます。

代わりに(または追加で)キーストロークをキャッチするには、WindowレベルでCtrl-Gのリスナーを登録する必要があります。したがって、Windowタグのトップレベルで、これを挿入します(基本的には from here ):

_<Window.InputBindings>
    <KeyBinding Modifiers="Control"
                Key="G"
                Command="{StaticResource hwc}" 
                CommandParameter="window input binding"
    />
</Window.InputBindings>
_

CommandParameterタグをKeyBindingに配置できるのは、自己閉鎖型XMLから「実際の」開閉KeyBindingタグに移動できることに注意してください。

これで完了です。アプリを実行し、Ctrl-Gを押します。わあ.

プレイヤーをまっすぐにし、ほとんどのコマンドとMenuItemsのイントロよりも魔法の束縛をはるかに少なくすると、かなり簡単です。


考えられるプロのヒント:

CommandBinding全体がしばらく混乱しました。これは、特定のコマンドタイプではjustであると考えています。つまり、好きなCommandを接続することはできません。 ここの自慢のこと (まあまあまあの入門チュートリアルです!)...

完全に明らかではないかもしれませんが、コマンドを使用すると、アイテムのキーボードショートカット、テキスト、およびInputGestureTextをすべて無料で入手できます。WPFは、アクティブなコントロールとその状態に応じてアイテムを自動的に有効/無効にします。この場合、テキストが選択されていないため、切り取りとコピーは無効になっていますが、クリップボードは空ではないため、貼り付けは有効になっています!

...魔法のようなものであり、必ずしも良いとは限らず、WPFメニューを初めて使用する場合は混乱する可能性があります。

7
ruffin