Come posso assegnare il comportamento 'Chiudi premere Esc-chiave' a tutte le finestre WPF all'interno di un progetto?

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

Domanda

C'è un modo semplice di raccontare l'intera applicazione WPF per reagire alla pressione dei tasti fuga tentando di chiudere il momento concentrata vedova? E non è un grande fastidio per impostare manualmente le associazioni comandamenti e di input, ma mi chiedo se ripetere questo XAML in tutte le finestre è la più elegante approccio?

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

Tutti i suggerimenti costruttivi benvenuti!

È stato utile?

Soluzione

Tutto quello che posso suggerire di migliorare che è quello di eliminare la necessità di un gestore di eventi legandosi ad un'istanza di comando statico.

. Nota: questo sarà solo il lavoro in .NET 4 in poi in quanto richiede la capacità di legarsi alle proprietà KeyBinding

In primo luogo, creare un comando che prende una finestra come parametro e chiama Close all'interno del metodo 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();
}

Quindi è possibile vincolare il proprio KeyBinding alla proprietà Instance statica:

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

Non so che questo è necessariamente migliore che il vostro approccio, ma significa marginalmente meno boilerplate nella parte superiore di ogni Window e che non è necessario includere un gestore di eventi in ogni

Altri suggerimenti

o si può solo aggiungere un pulsante con Annulla come testo e set IsCancel = True. Poi fuggire funzionerà come comando predefinito di chiusura.

creare RoutedUICommand come qui di seguito

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

e inserirlo comando vincolante nel costruttore

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

Il Windows mostrati con ShowDialog() si può usare:

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

È inoltre possibile utilizzare PreviewKeyDown evento

PreviewKeyDown="UserControl_PreviewKeyDown"

Codice dietro di voi chiama comando di chiusura

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

Un altro modo possibile è quella di usare proprietà associate

Bellow è un codice di succo:

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

Nessuno di sopra ha lavorato per me, tranne Kai di. Ho modificato la sua risposta: ho aggiunto 'btn_close.IsCancel = true;' al costruttore. SettingsWindow è la mia seconda finestra, e la finestra principale è (default) MainWindow.

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

Speranza che aiuta,

Simon S amore nia

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top