Comment puis-je attribuer le comportement « Fermer sur la presse Escape-clé » à toutes les fenêtres WPF dans un projet?
-
27-09-2019 - |
Question
est-il un moyen simple de dire toute application WPF pour réagir à échapper en essayant touches de fermer la veuve concentre actuellement? Il n'est pas une grande peine de configurer manuellement les liaisons et entrée mais commandements je me demande si le répéter XAML dans toutes les fenêtres est l'approche la plus élégante?
<Window.CommandBindings>
<CommandBinding Command="Close" Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Key="Escape" Command="Close" />
</Window.InputBindings>
Toutes les suggestions constructives sont les bienvenus!
La solution
Tout ce que je peut suggérer d'améliorer c'est d'éliminer la nécessité d'un gestionnaire d'événements en se liant à une instance de commande statique.
Note:. Cela ne fonctionnera que dans .NET 4 partir car elle nécessite la capacité de se lier aux propriétés KeyBinding
Tout d'abord, créez une commande qui prend une fenêtre en tant que paramètre et appelle Close
dans la méthode de Execute
:
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();
}
Ensuite, vous pouvez lier votre KeyBinding
à la propriété Instance
statique:
<Window.InputBindings>
<KeyBinding Key="Escape" Command="{x:Static local:CloseThisWindowCommand.Instance}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />
</Window.InputBindings>
Je ne sais pas que ce soit nécessairement mieux que votre approche, mais cela ne signifie un peu moins au passe-partout en haut de chaque Window
et que vous n'avez pas besoin d'inclure un gestionnaire d'événements en chaque
Autres conseils
Ou vous pouvez simplement ajouter un bouton Annuler comme du texte et les IsCancel = True
. Alors échapper fonctionnera comme commande par défaut pour fermer.
créer RoutedUICommand
comme ci-dessous
private static RoutedUICommand EscUICommand = new RoutedUICommand("EscBtnCommand"
, "EscBtnCommand"
, typeof(WindowName)
, new InputGestureCollection(new InputGesture[]
{ new KeyGesture(Key.Escape, ModifierKeys.None, "Close") }));
et ajoutez commande de liaison dans le constructeur
CommandBindings.Add(new CommandBinding(EscUICommand, (sender, e) => { this.Hide(); }));
Sur Window
s affichés avec ShowDialog()
vous pouvez utiliser:
<!-- Button to close on Esc -->
<Button IsCancel="True" Width="0" Height="0"/>
Vous pouvez également utiliser l'événement PreviewKeyDown
PreviewKeyDown="UserControl_PreviewKeyDown"
code que vous appelez derrière commande de fermeture
private void UserControl_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
_vm.OnCloseCommand(sender);
}
}
Une autre possibilité consiste à utiliser les propriétés attachées
Bellow est un code essentiel:
<script src="https://gist.github.com/meziantou/1e98d7d7aa6aa859d916.js"></script>
Aucune ci-dessus a fonctionné pour moi, sauf Kai a. Je modifié sa réponse: j'ai ajouté « btn_close.IsCancel = true; » au constructeur. SettingsWindow est ma deuxième fenêtre, et la fenêtre principale est (par défaut) MainWindow.
public partial class SettingsWindow : Window {
public SettingsWindow() {
InitializeComponent();
btn_close.IsCancel = true;
}
private void btn_close_Click(object sender, RoutedEventArgs e) {
this.Close();
}
}
it helps,
Simon S nia amour