¿Cómo puedo asignar el comportamiento 'Cerrar al pulsar la tecla de Escape-' a todas las ventanas de WPF dentro de un proyecto?

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

Pregunta

¿Hay alguna forma sencilla de decir toda la aplicación WPF para reaccionar a las pulsaciones de tecla escape al intentar cerrar la viuda centra actualmente? No es un gran molestarse en configurar manualmente los enlaces de mando y de entrada pero me pregunto si la repetición de este XAML en todas las ventanas es el enfoque más elegante?

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

Cualquier sugerencias constructivas son bienvenidas!

¿Fue útil?

Solución

Todo lo que puede sugerir a mejorar ese es eliminar la necesidad de un controlador de eventos mediante la unión a una instancia de comando estático.

Nota:. Esto sólo trabajo en .NET 4 en adelante, ya que requiere la capacidad de unirse a las propiedades KeyBinding

En primer lugar, crear un comando que lleva una ventana como un parámetro y llama Close dentro del método 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();
}

A continuación, se puede vincular a su KeyBinding a la propiedad Instance estática:

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

No sé que esto es necesariamente mejor de su enfoque, pero significa un poco menos repetitivo en la parte superior de cada Window y que no es necesario incluir un controlador de eventos en cada

Otros consejos

o usted podría agregar un botón con Cancelar como texto y IsCancel = True conjunto. Luego escapar funcionará como comando predeterminado para cerrar.

crear RoutedUICommand, como a continuación

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

y agregarlo comando de unión en el constructor

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

En Windows muestran con ShowDialog() puede usar:

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

También puede utilizar PreviewKeyDown Evento

PreviewKeyDown="UserControl_PreviewKeyDown"

Código detrás de usted llame orden de cierre

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

Otra forma posible es usar las propiedades adjuntas

Bellow es un código de GIST:

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

Ninguna de las anteriores trabajó para mí, si Kai. He modificado su respuesta: He añadido 'btn_close.IsCancel = true;' al constructor. SettingsWindow es mi segunda ventana, y la ventana principal es (por defecto) MainWindow.

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

Espero que ayuda,

Simon S amor nia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top