2016-07-15 11 views
0

メニューショートカットが機能していません。メニューキーのバインディングが機能しない

私はこの問題をちょっと読んだので、回答hereによれば、それはクリックの代わりにコマンドを使う必要があることを意味します。ここで

メニュー構造である:

<MenuItem x:Uid="MenuItem_10" Header="Zoom In" InputGestureText="CTRL +" Click="menuViewZoomInOutScaleFactor" Tag="25"> 
    <MenuItem.InputBindings> 
     <KeyBinding x:Uid="KeyBinding_7" Key="OemPlus" Modifiers="Ctrl" /> 
    </MenuItem.InputBindings> 
</MenuItem> 
<MenuItem x:Uid="MenuItem_11" Header="Zoom Out" InputGestureText="CTRL -" Click="menuViewZoomInOutScaleFactor" Tag="-25"> 
    <MenuItem.InputBindings> 
     <KeyBinding x:Uid="KeyBinding_8" Key="OemMinus" Modifiers="Ctrl"/> 
    </MenuItem.InputBindings> 
</MenuItem> 
<Separator x:Uid="Separator_7"/> 
<MenuItem x:Uid="MenuItem_12" Header="400%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=400}, Mode=OneWay}" Tag="400" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_13" Header="300%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=300}, Mode=OneWay}" Tag="300" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_14" Header="250%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=250}, Mode=OneWay}" Tag="250" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_15" Header="200%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=200}, Mode=OneWay}" Tag="200" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_16" Header="175%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=175}, Mode=OneWay}" Tag="175" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_17" Header="150%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=150}, Mode=OneWay}" Tag="150" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_18" Header="125%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=125}, Mode=OneWay}" Tag="125" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_19" Header="100%" IsCheckable="True" InputGestureText="CTRL + 0" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=100}, Mode=OneWay}" Tag="100" Click="menuViewZoomScaleFactor"> 
    <MenuItem.InputBindings> 
     <KeyBinding x:Uid="KeyBinding_9" Key="D0" Modifiers="Ctrl"/> 
    </MenuItem.InputBindings> 
</MenuItem> 
<MenuItem x:Uid="MenuItem_20" Header="75%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=75}, Mode=OneWay}" Tag="75" Click="menuViewZoomScaleFactor"/> 
<MenuItem x:Uid="MenuItem_21" Header="50%" IsCheckable="True" IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={ValueConverters:IsIntegerEqual To=50}, Mode=OneWay}" Tag="50" Click="menuViewZoomScaleFactor"/> 
<Separator x:Uid="Separator_8"/> 
<MenuItem x:Uid="MenuItem_22" Header="Custom..."/> 

あなたが見ることができるように、メニュー項目の3を関連付けることがshoudl:

  1. はCtrl + 0
  2. はCtrl +
  3. Ctrlキー -

私はfiできませんでしたKeysリストの特定の文字を確認し、D0,OemPlusおよびOemMinusに解決しました。どちらにせよ、私のキーバインドは実際に処理されていません。どうして?

クリックを使ってコマンドに変換する方法がわかりません。これまでのところ、私のコマンドはすべてビューモデルに縛られていました。しかし、この例では、コードの背後に関連するコマンドが必要です。ここで

は私の現在のクリックハンドラです:

private void menuViewZoomScaleFactor(object sender, RoutedEventArgs e) 
{ 
    SetZoomFactor(Int32.Parse((String)((MenuItem)sender).Tag)); 
} 

private void menuViewZoomInOutScaleFactor(object sender, RoutedEventArgs e) 
{ 
    int iStep = Int32.Parse((String)((MenuItem)sender).Tag); 

    if ((iStep == 25 && Settings.Default.ZoomFactor <= 375) || 
     (iStep == -25 && Settings.Default.ZoomFactor >= 75)) 
    { 
     SetZoomFactor(Settings.Default.ZoomFactor + iStep); 
    } 
} 

private void SetZoomFactor(int iZoomFactor) 
{ 
    Settings.Default.ZoomFactor = iZoomFactor; 

    IServiceProvider serviceProvider = myWorkbookView.Document as IServiceProvider; 

    Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); 
    Guid serviceGuid = SID_SWebBrowserApp; 

    Guid iid = typeof(SHDocVw.IWebBrowser2).GUID; 

    SHDocVw.IWebBrowser2 WebBrowser = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid); 
    WebBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, Settings.Default.ZoomFactor); 
} 

だから私は私のメニューキーバインディングが機能取得する必要があります。

+0

可能な複製(http://stackoverflow.com/questions/20794918/wpf-how-to-use-command- input-bindings) –

+0

あなたは 'InputBindings'を正しく使用していません。上記の答えを確認してください。 –

+0

@EliArbel私はそれを見ています。私はクラスの背後にあるMainWindowコードの外にある静的クラスがmainwindowコンテンツへのアクセス権を持っていることを理解していません。 –

答えて

2

WPFでInputBindingsを使用する場合は、コマンドを使用する必要があります。メニュー項目にコマンドを割り当て、コマンドバインディングと入力ジェスチャーを追加する必要があります。 CommandParameterを使用すると、コマンドバインディングハンドラに引数を渡すことができます。

コマンドソース(メニュー項目または入力バインド)とコマンドバインディングの間のリンクを定義するキーと考えてください。コマンドバインディングは、コマンドが実行できるビジュアルツリーのスコープを定義します。背後

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow"> 
    <Window.CommandBindings> 
     <CommandBinding Command="IncreaseZoom" 
         Executed="IncreaseZoom_OnExecuted" /> 
     <CommandBinding Command="Zoom" 
         Executed="Zoom_OnExecuted" /> 
    </Window.CommandBindings> 
    <Window.InputBindings> 
     <KeyBinding Gesture="Ctrl+Plus" 
        Command="IncreaseZoom" /> 
    </Window.InputBindings> 
    <Grid> 
     <Menu> 
      <MenuItem Header="View"> 
       <MenuItem x:Uid="MenuItem_10" 
          Header="Zoom In" 
          InputGestureText="CTRL +" 
          Command="IncreaseZoom" /> 
       <MenuItem x:Uid="MenuItem_12" 
          Header="400%" 
          IsCheckable="True" 
          IsChecked="{Binding Whatever}" 
          Command="Zoom"> 
        <MenuItem.CommandParameter> 
         <system:Int32>400</system:Int32> 
        </MenuItem.CommandParameter> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 

コード:

private void IncreaseZoom_OnExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    IncrementZoom(25); 
} 

private void Zoom_OnExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    var zoom = (int)e.Parameter; 
    SetZoom(zoom); 
} 

あなたは組み込みコマンドで、適切なコマンドが見つからない場合は、静的クラスで独自に定義することができます。

public static class MyCommands 
{ 
    public static readonly RoutedCommand SampleCommand = new RoutedCommand(
     nameof(SampleCommand), typeof(MyCommands), 
     new InputGestureCollection { new KeyGesture(Key.B, ModifierKeys.Alt) }); 
} 

をご覧のように、デフォルトの入力ジェスチャーを定義することもできるので、XAMLで追加の入力バインディング(コマンドバインディングのみ)を指定する必要はありません。 XAMLでこのクラスを使用するには:[WPF:コマンド&入力バインディングを使用する方法]の

<MenuItem Command="{x:Static m:MyCommands.SampleCommand}" /> 
+0

OK、私は進歩を遂げた、私はコマンドを発射することができます。しかし、メニュー項目をクリックしない限り、パラメータはnullです。私がちょうどkkeypressを使うと、パラメータはnullになります。メニュー項目をクリックすると、パラメータが有効になります。 –

+1

'KeyBinding'でもパラメータを渡すことができます。しかし、おそらくそれをするべきではありません。別のコマンドを使用してください。 –

+0

OKです。アクセス方法しかし...もし私が尋ねることができるのであれば、コマンドとキーバインディングのパトナーとして "Tag"の値を使うことはできないのでしょうか?そうすれば私は1つのコマンドしか持てません。それ以外の場合は、2つのコマンドを定義する必要がありもし必要なら私は欲しい。 –

関連する問題