2016-04-05 12 views
5

Ich habe eine Software, die mehrere XAML-Fenster für verschiedene Instanzen verwendet: Zum Beispiel, um einige Informationen zu exportieren, habe ich sekundäre XAML-Fenster mit einem anderen Format als die Mutter-Software erstellt. Sie funktionieren gut.C# Tastaturkürzel beenden Arbeit nach dem Aufruf 2. XAML-Fenster

Mein Problem ist, dass, wenn ich meine Software ohne Aufruf eines dieser sekundären XAML-Fenster verwenden, die Verknüpfungen ziemlich gut funktionieren. Aber sobald ich diese neuen XAML-Fenster anrufe, funktionieren die Verknüpfungen nicht mehr. Ich muss das Programm neu starten, damit sie wieder lebendig werden.

Irgendwelche Hinweise auf dieses Verhalten? Außerdem konnte ich noch keine Verknüpfungen wie STRG + Letter zum Beispiel erstellen. Ich habe viele Codes zu sehen, wie es scheint ziemlich geradlinig, aber sie einfach nicht funktionieren ...

-Code

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    Key key = e.Key; 


    if ((key == Key.Left) && previousButton.IsEnabled) 
     button_PreviewMouseDown(previousButton, null); 
    else if ((key == Key.Right) && nextButton.IsEnabled) 
     button_PreviewMouseDown(nextButton, null); 
    //New Label 
    else if (key == Key.L) 
     //else if (key == Key.LeftAlt && e.Key.ToString() == "L") 
     NewLabel_Click(sender, e); 
    // Begin Event 
    else if (key == Key.B) 
     BeginEvent_Click(sender, e); 
    // End Event 
    else if (key == Key.E) 
     EndEvent_Click(sender, e); 
    // Delete Label 
    else if (key == Key.K) 
     DeleteLabel_Click(sender, e); 
    else if (key == Key.R) 
     // Delete Event 
     DeleteEvent_Click(sender, e); 
    // Edit Label 
    else if (key == Key.I) 
     EditLabel_Click(sender, e); 
    // Edit Event 
    else if (key == Key.F) 
     EditEvent_Click(sender, e); 
} 

EDIT 1

ich jetzt, dass so schnell wie ich herausgefunden habe Rufen Sie ein C# -Popup-Meldungsfeld auf, indem Sie einfach "Event Created OK" sagen, damit die Verknüpfungen wieder lebendig werden!

MessageBox.Show("Event Created"); 

Irgendeine Idee, warum dies geschehen könnte?

+2

sorge dafür, deinen Code und das genaue Problem zu teilen – Apoorv

+0

Sollte eine Switch-Anweisung, insbesondere für die Lesbarkeit verwenden; Ich habe abgestimmt, viel Glück. – KDOT

+0

Idee, Event-Handler direkt mit einigen (wahrscheinlich falschen) 'sender' und' e' aufzurufen ist schlecht, eher Code aus Handler in separate Methode verschieben und dann können Sie diese Methode von verschiedenen Event-Handlern aufrufen. Es ist nicht klar, was passiert, wenn Sie das zweite Fenster anzeigen (verwandten Code hinzufügen). Und die Beschreibung des Problems * "nicht arbeiten" * ist genial. Was funktioniert nicht? Wird der Event-Handler nicht mehr aufgerufen (setzen Sie den Breakpoint in der ersten Zeile und sehen Sie sich selbst)? Könnte es sein, dass ein anderes Steuerelement den Fokus erhält (oder das Fenster nicht mehr aktiv ist, also keine Eingabe mehr)? – Sinatr

Antwort

0

Eine andere Möglichkeit ist die Verwendung von RoutedCommands. Mit einem RoutedCommand weisen Sie KeyGestures zu.

Beispiel

/// <summary> 
/// Save Log command 
/// </summary> 
public static readonly RoutedCommand SaveLog = 
    new RoutedCommand("SaveLog", typeof(Commands), 
     new InputGestureCollection 
     { 
      new KeyGesture(Key.S, ModifierKeys.Control,"Save log contents to a file. (Ctl+S)") 
     }); 

die RoutedCommand

in XAML Weisen
  <Button Style="{StaticResource LoggingWindowSaveLogButton}" Command ="{x:Static local:Commands.SaveLog}" /> 

Binden der Befehl an Ihrem Fenster

<!-- Command Bindings--> 
<Window.CommandBindings> 
    <CommandBinding Command="{x:Static local:Commands.SaveLog}" Executed="SaveLogCommand" CanExecute="SaveLogCommandCanExecute"/> 
</Window.CommandBindings> 

implementieren Dann SaveLogCommandCanExecute und SaveLogCommand

wenn SaveLogCommandCanExecute falsch gibt es automatisch jede GUI deaktivieren, die die RoutedCommand gebunden ist.

Denken Sie daran, das Fenster, das die Tastenkombination MUST Fokus hat.