メニュー項目のショートカットを設定する簡単な方法が必要です。
しかし、これはショートカットでは機能せず、クリックするだけで機能します。
<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を使用しています
H.B.正しかった...精度を追加したかっただけです。
Click
のMenuItem
イベントを削除し、代わりに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>
そのようにして、複数の入力を同じコマンドに関連付けることができます。
私の謙虚な意見では、ヘッダーで_を使用する方がはるかに簡単です。これにより、目的のホットキーが自動的に作成されます。
例えば:
<MenuItem Header="_Editar">
<MenuItem Header="_Procurar" Name="MenuProcurar"
InputGestureText="Ctrl+F"
Click="MenuProcurar_Click">
<MenuItem.ToolTip>
<ToolTip>
Procurar
</ToolTip>
</MenuItem.ToolTip>
</MenuItem>
</MenuItem>
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 。
Windows.Forms&gulpVB 6なので、私は Jonathanに同意 と Jase 必ずしもCommandBindings
であるとは限らないイベントハンドラーを静的に接続するための、より簡単で手続き的な方法が必要だということです。
このような、_CommandBinding
以外のハンドラーを使用するための良いチュートリアルですが、ボタンに重点を置いて、 このMSDNブログ投稿 で見つけることができます。蒸留してMenuItem
sをターゲットにします...
まず、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で多く使用します。
MenuItem
sをxamlに追加しましょう。ストックGrid
をDockPanel
に置き換えました。これは、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>
_
すべてに同じコマンドを使用していることに注意してください!しかし、どのウィジェットがイベントをスローしたかをどのように確認できますか?そのためには、CommandParameter
を使用する必要があります-Execute
メソッドのシグネチャExecute(object parameter)
を覚えておいてください。そのCommandParameter
パラメーターは、イベントの処理方法を知るために使用できるものです。これを実行してみて、MessageBox
がCommandParameter
にあるものを使用してイベントのソースを知らせることに注意してください。すべて手動で行っていますが、それほど悪くはありません。
また、これらのオブジェクトを好きなだけ複雑にすることができることに注意してください。 MenuItem
タグのプロパティを使用してパラメーターを定義するか、上記の[開く]メニュー項目のように「実際の」_<MenuItem.CommandParameter>
_タグを使用して複雑なものを定義できます。この場合、親Window
objectを渡します。 VB6-ishコンテキストをイベントハンドラーコードにスローする最も簡単な(ただし、最もクリーンではない)方法でした。
MenuItem
sに追加(別名、「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メニューを初めて使用する場合は混乱する可能性があります。