有没有讲出全部WPF应用程序反应试图通过关闭当前聚焦寡妇逃生按键的任何直接的方式?这不是一个很大的麻烦手动设置的命令 - 输入绑定,但我不知道是否在所有窗口重复此XAML是最优雅的方式?

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

任何建设性的建议表示欢迎!

有帮助吗?

解决方案

所有我可以建议,以改善其是通过结合一个静态指令实例以除去用于一个事件处理程序的需要。

注意:这将仅在.NET 4工作开始,因为它需要的能力结合到KeyBinding属性

首先,创建采用一个窗口作为参数并调用CloseExecute方法中的命令:

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(); }));

在与Window可以使用所示ShowDialog()s:

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

您也可以使用PreviewKeyDown事件

PreviewKeyDown="UserControl_PreviewKeyDown"

代码背后叫你关闭命令

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

另一种可能的方法是使用附加属性

娄是要旨代码:

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

工作的以上都不对我来说,除了启的。 我修改了他的答案:我加了“btn_close.IsCancel = TRUE;”构造器。 SettingsWindow是我的第二窗口,主窗口是(默认)主窗口。

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

希望它帮助,

西蒙 爱NIA

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top