Как я могу назначить «Закрыть на поведение escape-Key» для всех WPF Windows в рамках проекта?

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

Вопрос

Есть ли какой-либо простой способ рассказать всем приложению WPF для реагирования на клавише escape, пытаясь закрыть текущую вдавку вдали Не очень больно вручную установить привязки командной и ввода, но мне интересно, если повторять этот XAML во всех окнах, является наиболее элегантным подходом?

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

Любые конструктивные предложения приветствуются!

Это было полезно?

Решение

Все, что я могу предложить улучшить это, это удалить потребность в обработчике события, привязывая к статическому экземпляру команды.

Примечание: это будет работать только в .NET 4, так как требуется возможность связываться с KeyBinding характеристики.

Сначала создайте команду, которая берет окно в качестве параметра и вызовы Close внутри 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();
}

Тогда вы можете связать ваш KeyBinding к статическому Instance имущество:

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

Я не знаю, что это обязательно лучше чем ваш подход, но это означает незначительно меньшее количество котельной в верхней части каждого Window И что вам не нужно включать обработчик событий в каждом

Другие советы

Или вы могли бы просто добавить кнопку с отменой в виде текста и установить IsCancel = True. Отказ Затем убежать будет работать как команда по умолчанию, чтобы закрыть.

Создайте RoutedUICommand как ниже

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

и добавьте его привязку команды в конструкторе

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

На WindowS показан с ShowDialog() вы можете использовать:

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

Вы также можете использовать событие PreviewkyDown

PreviewKeyDown="UserControl_PreviewKeyDown"

Код за вызовом вы закрываете команду

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

Другим возможным способом является использование прикрепленных свойств

Bellow - это код Gist:

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

Ничего не работало для меня, кроме Кай. Я изменил свой ответ: я добавил 'btn_close.iscancel = true;' конструктору. SettingsWindow - мое второе окно, а главное окно (по умолчанию) MainWindow.

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

Надеюсь, поможет,

Саймон с любовь НИА

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top