2016-07-15 7 views
0

Keiner meiner Menüverknüpfungen arbeiten.Menü Tastenbelegungen arbeiten nicht

Ich habe ein wenig zu diesem Thema gelesen und entsprechend der Antwort here bedeutet es, dass ich Befehle anstelle von Klicks verwenden muss.

Hier wird die Menüstruktur ist:

  1. Ctrl + 0
  2. Strg +
  3. Ctrl:

    <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..."/> 
    

    Wie Sie drei der Menüpunkte sehen können, shoudl mit in Verbindung gebracht werden -

ich konnte nicht fi nd diese spezifischen Buchstaben in der Liste Schlüssel und ließ sich für D0, OemPlus und OemMinus. Entweder wird keine meiner Tastenbindungen tatsächlich verarbeitet. Warum?

Ich kann nicht sehen, wie ich verwenden, Klicks auf Befehle umwandeln kann. Bis jetzt wurden alle meine Befehle mit dem Ansichtsmodell verknüpft. Aber in diesem Fall muss der Befehl mit dem Code dahinter verknüpft werden.

Hier sind meine aktuellen Klick-Handler:

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); 
} 

Also muss ich meine Menü-Tastenbelegungen funktionelle erhalten.

+0

Mögliche Duplikat [WPF: Wie Verwenden von Command & Eingabebindungen] (http://stackoverflow.com/questions/20794918/wpf-how-to-use-command- Eingabebindungen) –

+0

Sie verwenden 'InputBindings' nicht korrekt. Überprüfen Sie die Antwort oben. –

+0

@EliArbel Ich habe das gerade erst angesehen. Ich verstehe nicht, wie eine statische Klasse, die sich außerhalb des MainWindow-Codes hinter der Klasse befindet, für den Zugriff auf den Hauptfensterinhalt zuständig ist. –

Antwort

2

Wenn Sie InputBindings in WPF verwenden Sie Befehle verwenden. Sie müssen den Menüeinträgen Befehle zuweisen, Befehlsbindungen hinzufügen und Gesten eingeben. Sie können CommandParameter s verwenden, um Argumente an die Befehlsbinding-Handler weiterzugeben.

Stellen Sie sich das geroutete Befehlsobjekt als Schlüssel vor, der die Verbindung zwischen der Befehlsquelle (dem Menüelement oder einer Eingabebindung) und der Befehlsbindung definiert. Die Befehlsbindungen definieren die Bereiche der visuellen Struktur, wo der Befehl ausgeführt werden kann.

<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> 

-Code hinter:

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); 
} 

Wenn Sie nicht über einen geeigneten Befehl in den integrierten Befehle finden, können Sie Ihre eigene in einer statischen Klasse definieren:

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

Wie Sie sehen, können Sie sogar eine Standardeingabe-Geste definieren, so dass Sie keine zusätzliche Eingabe-Bindung in XAML angeben müssen (nur die Befehlsbindung). Um diese Klasse in XAML zu verwenden:

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

OK, ich machte Fortschritte, ich kann es bekommen, um den Befehl zu feuern. Aber wenn ich nicht auf den Menüeintrag klicke, ist der Parameter null. Wenn ich nur kkeypress benutze, ist der Parameter null. Wenn ich auf den Menüpunkt klicke, ist der Parameter gültig. –

+1

Sie können den Parameter auch in der 'KeyBinding' übergeben. Aber das solltest du wahrscheinlich nicht tun. Verwenden Sie einfach einen separaten Befehl. –

+0

OK, das funktioniert. Dahin kommen. Aber ... wenn ich fragen darf, ist es nicht möglich, einfach den "Tag" -Wert als Pamater für die Befehls- und Tastenanbindung zu verwenden? So habe ich nur einen Befehl. Ansonsten muss ich zwei Befehle definieren. Ich werde es bei Bedarf tun. –