Comment puis-je attribuer le comportement « Fermer sur la presse Escape-clé » à toutes les fenêtres WPF dans un projet?

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

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!

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top