WPFおよびC#でキーボードを使用してファイルメニュー項目を選択するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1405537

  •  05-07-2019
  •  | 
  •  

質問

WPF UIアプリケーションを開発しています。

画面上部にメニューがあり、ファイル、ヘルプメニュー項目があります。

ファイル内->バックエンド機能(ショートカットキーはctrl + B)、終了(Ctrl + x)サブメニュー項目。

サブメニュー項目をクリックすると、対応するウィンドウが開きます。

それで、マウスを使用せずに、ctrl + BまたはCtrl + xを押すと、どのようにウィンドウを開くことができますか?

また、「F」の下に小さな線を表示するにはどうすればよいですか。ユーザーがAltキーを押しながらFキーを押すと、[ファイル]メニューが表示されるように、ファイルで。

C#を使用してWPFに取り組んでいます。

役に立ちましたか?

解決

ICommand、RoutedUICommand、InputGestureCollection、およびCommandManagerを調査する必要があります。少し前もってインフラストラクチャが機能しますが、WPFコマンドパターンを使用すると、メインメニュー、コンテキストメニュー、ボタンクリックなどでコマンドを共有できます。コマンドとして記述されたアクションでは、コマンドを使用するアプリケーション内のすべての場所で/一貫して無効にし、コードの繰り返しを減らすためにもう1つの間接層を追加します。

次の例はVB.Netにあります(申し訳ありませんが、簡単に翻訳できるはずです)。

ICommandを実装するクラスとして、必要な各アクションを実装します。

Public Class OpenWindowCommand
  Implements ICommand

  Public Function CanExecute(parameter as Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
    'enter code that determines whether this command should be enabled or not
    'if you are listening to some backend logic that changes this state, you can
    'raise a CanExecuteChanged event
  End Function

  Public Sub Execute(parameter as Object) Implements System.Windows.Input.ICommand.Execute
     'code that you want to run for the action
  End Sub
 End Class

各コマンドの共有インスタンスを保存するクラスを作成します。

Public Class MyCommands
  Private Shared ReadyOnly openWindowCmd As ICommand = New OpenWindowCommand()
  Private Shared _openWindow as RoutedUICommand

  Shared Sub New()
    'static constructor
    Dim shortcut = New KeyGesture(Key.W, ModifierKeys.Control)
    RegisterCommand(_openWindow, "OpenWindow", "Open...", shortcut, AddressOf ExecuteOpenWindow, AddressOf CanExecuteOpenWindow)
    'add more commands as needed
  End Sub

  Private Shared Sub RegisterCommand(ByRef command as RoutedUICommand, ByVal name as String, ByVal text as String, ByVal gesture as KeyGesture, ByVal executeHandler as ExecutedRoutedEventHandler, ByVal canExecuteHandler as CanExecuteRoutedEventHandler)
    Dim inputs = New InputGestureCollection()
    If gesture IsNot Nothing Then inputs.Add(gesture)
    command = New RoutedUICommand(text, name, GetType(MyCommands), inputs)
    Dim binding = New CommandBinding(command, executeHandler, canExecuteHandler)
    Application.Current.MainWindow.CommandBindings.Add(binding)
    CommandManager.RegisterClassCommandBinding(GetType(Window),binding)
  End Sub

  Public Shared ReadOnly Property OpenWindow() as RoutedUICommand
    Get
      Return _openWindow
    End Get
  End Property
  Public Shared Sub ExecuteOpenWindow(sender as Object, e as ExecutedRoutedEventArgs)
    openCmd.Execute(e.Parameter)
  End Sub
  Public Shared Sub CanExecuteSave(sender as Object, e as CanExecuteRoutedEventArgs)
    e.CanExecute = openCmd.CanExecute(e.Parameter)
    e.Handled = True
  End Sub

End Class

メニューのXAMLで、次のコマンドにバインドできます:

<Window.Resources>
  <local:MyCommands x:Key="commands"/>
</Window.Resources>
...
<MenuItem Name="mnuOpenWindow" Command="{Binding Path=OpenWindow}"/>

これは、コマンドを使用するための最小限の要件を少し超えていますが、かなり大きなアプリケーションでは、この追加のインフラストラクチャが非常に役立つことがわかりました。コマンドを作成して登録すると、XAMLドキュメントでのコマンドへのバインドは簡単になり、MyCommandsクラスを介して各アクションの共有プロパティを公開することで、必要に応じて純粋にコードでコマンドにアクセスできます。

他のヒント

メニュー項目のアクセラレータを表す小さな行を追加するには、XAMLでアンダースコアを使用します。

<MenuItem Header="_File">
    <MenuItem Header="_Backend Features" />
    <MenuItem Header="E_xit" />
</MenuItem>

ショートカットキーについては、まず、Exitに Ctrl + X を使用しないことをお勧めします。これは一般にCutに使用されるためです。通常、exitにはショートカットキーはありませんが、 Alt + F4 を押してメインウィンドウを閉じると同じ効果があります。

実際の質問に関しては、いくつかのオプションがありますが、両方を使用するには、 Click イベントではなく、Commandを使用してMenuItemsを処理する必要があります。

最初のオプションは、ショートカットキーごとに InputBinding を設定することです。メインウィンドウで次のように実行されます。                   

Command 属性には、そのショートカットのコマンドを表す式を指定する必要があります(を定義するときは、同じ Command を使用します) > MenuItem も)。 Commands クラスがある場合、次のようなことができます:

static class Commands
{
    public static ICommand BackendFeaturesCommand = ...;
}

そしてXAMLで:

<KeyBinding Key="B" Modifiers="Control"
    Command="{x:Static Commands.BackendFeaturesCommand}" />

他のオプションは、コマンドを RoutedUICommand 、および InputGesture を指定します。これにより、ショートカットキーが自動的に接続されます。

WPFアプリケーションフレームワーク(WAF) 。理解するのは非常に簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top