1

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

this.KeyDown += new KeyEventHandler(HandleEsc);

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

问题是我必须在我的应用程序中的每个 WPF 表单上编写相同的代码。我正在寻找一种将其置于主题样式中的方法,这样我就可以避免重复编码。有没有办法做到这一点?

谢谢,

4

1 回答 1

0

我认为这不能使用样式来完成。不过,您可以做的是在 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(); }
        }
    }
}

现在每次创建新窗口时,都可以让它继承自 thisEscapeWindow而不是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

于 2013-08-28T22:08:39.787 回答