WPF可以在主题样式中映射Escape键

本文关键字:映射 Escape 样式 WPF | 更新日期: 2023-09-27 18:29:29

我搜索了SO,得到了适用于各个表单的以下代码。

this.KeyDown += new KeyEventHandler(HandleEsc);
private void HandleEsc(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Escape) 
    { 
        this.Close(); 
    }
}

问题是,我必须对应用程序中的每个WPF表单进行相同的编码。我正在寻找一种方法,把它放在主题风格中,这样我就可以避免重复编码。有办法做到这一点吗?

谢谢,

WPF可以在主题样式中映射Escape键

我不认为使用样式可以做到这一点。不过,您可以做的是在Window和Window类之间创建一个新层,并让该中间层负责处理Escape键。要做到这一点,首先创建一个名为EscapeWindow的新类,并让它从Window继承,如下所示:

namespace WpfApplication1
{
    public class EscapeWindow : Window
    {
        public EscapeWindow()
            : base()
        {
            this.KeyDown += new KeyEventHandler(HandleEsc);
        }
        private void HandleEsc(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape) { this.Close(); }
        }
    }
}

现在,每次创建新窗口时,都可以让它从EscapeWindow而不是Window继承。例如,你的MainWindow看起来像这样:

public partial class MainWindow : EscapeWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

请注意,由于WPF-Windows是在XAML中部分定义的,因此您还需要更改该部分实现。在这种情况下,MainWindow.xaml看起来是这样的:

<local:EscapeWindow x:Class="WpfApplication1.MainWindow" 
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
    </Grid>
</local:EscapeWindow>

这可能不一定会让您的生活更轻松,因为每次创建Window时都需要更改引用,但它为一般处理Escape按钮提供了一个干净的框架。