Wie kann ich das ‚Close auf Escape-Taste drücken‘ Verhalten für alle WPF Fenster innerhalb eines Projektes zuweisen?
-
27-09-2019 - |
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!
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 Window
s 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
verwendenPreviewKeyDown="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