Wie kann ich das ‚Close auf Escape-Taste drücken‘ Verhalten für alle WPF Fenster innerhalb eines Projektes zuweisen?

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

Frage

Gibt es eine einfache Möglichkeit, die gesamte WPF-Anwendung zu sagen, zu reagieren Tastendrücken zu entkommen, indem er versucht die zur Zeit konzentriert Witwe zu schließen? Es ist kein großer manuell Setup stören die Kommando- und Eingabebindungen, aber ich frage mich, ob in allen Fenstern dieses XAML Wiederholung der eleganteste Ansatz ist?

<Window.CommandBindings>
        <CommandBinding Command="Close" Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
        <KeyBinding Key="Escape" Command="Close" />
</Window.InputBindings>

Jede konstruktive Vorschläge willkommen!

War es hilfreich?

Lösung

Alles, was ich kann zu verbessern vorschlagen auf das ist die Notwendigkeit für einen Event-Handler zu entfernen, indem auf eine statische Befehlsinstanz verbindlich.

. Hinweis: Dies funktioniert nur in .NET 4 ab, da sie die Fähigkeit zur Bindung an den KeyBinding Eigenschaften erfordert

Erstellen Sie zunächst einen Befehl, der ein Fenster als Parameter und ruft Close im Execute Methode:

public class CloseThisWindowCommand : ICommand
{
    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        //we can only close Windows
        return (parameter is Window);
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        if (this.CanExecute(parameter))
        {
            ((Window)parameter).Close();
        }
    }

    #endregion

    private CloseThisWindowCommand()
    {

    }

    public static readonly ICommand Instance = new CloseThisWindowCommand();
}

Dann können Sie Ihre KeyBinding zur statischen Instance Eigenschaft binden:

<Window.InputBindings>
    <KeyBinding Key="Escape" Command="{x:Static local:CloseThisWindowCommand.Instance}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />
</Window.InputBindings>

Ich weiß nicht, dass dies unbedingt besser als Ihr Ansatz, aber es bedeutet, geringfügig weniger vorformulierten an der Spitze eines jeden Window und dass Sie nicht brauchen, um einen Ereignishandler enthalten in jedes

Andere Tipps

Oder Sie könnten nur einen Knopf hinzufügen mit Abbrechen als Text und Satz IsCancel = True. Dann als Standardbefehl zu schließen Flucht funktionieren wird.

erstellen RoutedUICommand wie unter

 private static RoutedUICommand EscUICommand = new RoutedUICommand("EscBtnCommand"
       , "EscBtnCommand"
       , typeof(WindowName)
       , new InputGestureCollection(new InputGesture[] 
           { new KeyGesture(Key.Escape, ModifierKeys.None, "Close") }));

und fügen Sie es in Konstruktor Befehlsbindung

CommandBindings.Add(new CommandBinding(EscUICommand, (sender, e) => { this.Hide(); }));

Auf Windows mit ShowDialog() gezeigt Sie verwenden können:

<!-- Button to close on Esc -->
<Button IsCancel="True" Width="0" Height="0"/>

Sie können auch PreviewKeyDown Ereignis

verwenden
PreviewKeyDown="UserControl_PreviewKeyDown"

-Code hinter rufen Sie schließen Befehl

private void UserControl_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
            {
                _vm.OnCloseCommand(sender);
            }
        }

Eine andere Möglichkeit ist angebracht Eigenschaften verwenden

Bellow ist ein Kern-Code:

<script src="https://gist.github.com/meziantou/1e98d7d7aa6aa859d916.js"></script>

Keines der oben für mich gearbeitet, außer Kais. Ich änderte seine Antwort: Ich habe ‚btn_close.IsCancel = true;‘ In dem Konstruktor. SettingsWindow ist mein zweites Fenster und Hauptfenster ist (default) Hauptfenster.

  public partial class SettingsWindow : Window {
    public SettingsWindow() {
      InitializeComponent();
      btn_close.IsCancel = true;
    }
    private void btn_close_Click(object sender, RoutedEventArgs e) {
      this.Close();
    }
  }

Hope es hilft,

Simon S Liebe nia

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top