2009-03-02 24 views
41

私はメニューとサブメニューを含むアプリケーションを持っています。 Cut、Copy、Pasteなどのサブメニュー項目のいくつかにAppliocation Commandsを添付しました。
私はアプリケーションコマンドを持たない他のメニュー項目もあります。
これらのサブメニュー項目にカスタムコマンドバインディングを追加するにはどうすればよいですか?
私はthisの記事を見ましたが、私のサブメニューの項目にイベントを添付できません。WPFでカスタムルーティングコマンドを追加するにはどうすればよいですか?

私はRoutedUICommandクラスのインスタンスを作成し、私はウィンドウ1クラス(または任意のウィンドウクラスの名前を付けることを起こる)の後に置く静的クラスを使用
+0

このYouTubeのリンクを発見しました。 http://www.youtube.com/watch?v=mG4l0AaYBTM –

答えて

86

:ウィンドウのマークアップで名前空間を追加し

public static class Command { 

    public static readonly RoutedUICommand DoSomething = new RoutedUICommand("Do something", "DoSomething", typeof(Window1)); 
    public static readonly RoutedUICommand SomeOtherAction = new RoutedUICommand("Some other action", "SomeOtherAction", typeof(Window1)); 
    public static readonly RoutedUICommand MoreDeeds = new RoutedUICommand("More deeds", "MoreDeeeds", typeof(Window1)); 

} 

を今、私はちょうどアプリケーションコマンドの場合と同様にコマンドのバインディングを作成することができます

xmlns:w="clr-namespace:NameSpaceOfTheApplication" 

::、名前空間を使用すると、ウィンドウ1クラスがであることを

<Window.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Open" Executed="CommandBinding_Open" /> 
    <CommandBinding Command="ApplicationCommands.Paste" Executed="CommandBinding_Paste" /> 
    <CommandBinding Command="w:Command.DoSomething" Executed="CommandBinding_DoSomething" /> 
    <CommandBinding Command="w:Command.SomeOtherAction" Executed="CommandBinding_SomeOtherAction" /> 
    <CommandBinding Command="w:Command.MoreDeeds" Executed="CommandBinding_MoreDeeds" /> 
</Window.CommandBindings> 

そして、例えばメニューのバインディングを使用します。

<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="w:Command.DoSomething" /> 
+5

RoutedUICommandを保持する_static_クラスを持つことが私の鍵でした。 (彼らが私のWindow1クラスにいた場合、XAMLはそれらを見つけることができませんでした)。ありがとう! – ewall

+9

静的であるクラスの重要性は、実際には控えめにすることはできません。悲しいことに、非静的なクラスで定義されている場合、WPFは静かにコマンドを無視しているようです。 –

+3

なぜdownvote?あなたが間違っていると思われることを説明しなければ、答えを改善することはできません。 – Guffa

61

代わりに静的なクラスでそれらを定義するので、あなたにもXAMLで直接コマンドを宣言する可能性があります。例(Guffas良い例から適応):

<Window.Resources> 
    <RoutedUICommand x:Key="DoSomethingCommand" Text="Do Something" /> 
    <RoutedUICommand x:Key="DoSomethingElseCommand" Text="Do Something Else" /> 
</Window.Resources> 
<Window.CommandBindings> 
    <CommandBinding Command="{StaticResource DoSomethingCommand}" Executed="CommandBinding_DoSomething" /> 
    <CommandBinding Command="{StaticResource DoSomethingElseCommand}" Executed="CommandBinding_DoSomethingElse" /> 
</Window.CommandBindings> 
... 
<MenuItem Name="Menu_DoSomething" Header="Do Something" Command="{StaticResource DoSomethingCommand}" /> 
+1

これは実際のC#コードにバインドされていますか?もしそうなら、どうですか? RoutedUICommandsの目的は何ですか?彼らはどのような機能を追加しますか? –

+1

@ EdJ.Plunkett:1.はい。 2. CommandBindingsを通して: 'CommandBinding_DoSomething'と' CommandBinding_DoSomethingElse'はC#のコードです。 3./4。 RoutedCommandsと通常のButton_Click-bindingsの利点についての一般的な説明は、たとえば、http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/(「Who Cares?」を参照してください。 )。 – Heinzi

+0

ありがとうございます。私はRoutedUICommandsがGuffaの例に関連して何を追加しているのだろうかと思っていました。これは通常の昔のonclickの処理とは関係ありません(もしあなたが分かっていれば、これを尋ねることはありませんでした!ジョシュ・スミスの記事でそれを探してください。 –

15

私は私の答えは手遅れであることを知っているが、私はそれが将来のために役立つことを願っています。

私はGuffaとHeinziの回答に似ていますが、以前の結果を得るためには1つのコマンドしか使用できません。 私は通常Helpコマンド

<Window.CommandBindings> 
     <CommandBinding Command="{StaticResource Help}" Executed="HelpExecuted" /> 
    </Window.CommandBindings> 

を使用して、私は、各コールなどでCommandParametrを使用

<Window.InputBindings> 
    <KeyBinding Command="{StaticResource Help}" Key="A" Modifiers="Ctrl" CommandParameter="Case1"/> 
    <KeyBinding Command="{StaticResource Help}" Key="B" Modifiers="Ctrl" CommandParameter="Case2"/> 
    <KeyBinding Command="{StaticResource Help}" Key="C" Modifiers="Ctrl" CommandParameter="Case3"/> 
    <KeyBinding Command="{StaticResource Help}" Key="D" Modifiers="Ctrl" CommandParameter="Case4"/> 
    <MouseBinding Command="{StaticResource Help}" MouseAction="LeftDoubleClick" CommandParameter="Case5" /> 
</Window.InputBindings> 

または

<Button Command="Help" CommandParameter="Case6" Content="Button"> 
    <Button.InputBindings> 
     <KeyBinding Command="{StaticResource Help}" Gesture="Ctrl+D" CommandParameter="Case7"/> 
    </Button.InputBindings> 
</Button> 

とCSファイル内

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    string str = e.Parameter as string; 
    switch (str) 
    { 
     case null://F1 Pressed default Help 
       //Code 
      break; 
     case "Case1": 
       //Code 
      break; 
     case "Case2": 
       //Code 
      break; 
     case "Case3": 
       //Code 
      break; 
     case "Case4": 
      break; 
     case "Case5": 
       //Code 
      break; 
     case "Case6": 
       //Code 
      break; 
     case "Case7": 
       //Code 
      break; 
    } 
    e.Handled = true; 
} 

とifあなたはMVVMパターン

private void HelpExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    string str = e.Parameter as string; 
    Mvvm_Variable.Action(Input: str); 
    e.Handled = true; 
} 

を使用してViewModuleサイトへのスイッチを動かしています。 Actionは同じViewModuleクラスのメソッドです。

+1

ちょうどチケット!コマンドのプロパティ値を使用すると、私のために多くの新しい可能性が開かれました:-) MinimizeWindow、MaximizeWindow、RestoreDownWindowのプロパティでApplicationCommands.NotACommandを使用しました – Heliac

+0

私はこれを好きですが、それは制限があります - たとえば、メニューエントリに含まれるテキストはコマンドごとに定義されていますので、メニューが必要な場合(または後で追加する場合があります)、このメソッドは最良ではありませんコマンドテキストも)。 –

+0

@Bob、これは簡単なswitch文ですが、フォームごとに制限があります。コマンドパラメータ文字列を反映するすべてのショートカットの組み合わせを使用します。この場合でもルーティングされたコマンドはあなたを助けません。 –

関連する問題