WPF丢失事件处理程序

时间:2017-12-21 18:14:38

标签: wpf

我在.NET 4.7中有一个简单的WPF应用程序。主窗口侦听“Key Up”事件。如果按下Escape键,主窗口将自行关闭。这很好(至少它开始工作正常)。

主窗口还包含一个打开另一个窗口的按钮(称为X)。 X只是一个空窗口。它没有事件处理程序。当X打开时,主窗口中的Button被禁用。一旦X关闭,按钮就会重新启用。

这就是问题:一旦X关闭,主窗口的Key Up事件处理程序似乎就消失了......等等。我不能再按Escape关闭主窗口,除非我首先将焦点放在其中一个按钮上。如果我只是单击主窗口并按Escape键,它将不会关闭窗口。在显示Window X之前,情况并非如此。

事实证明,如果我禁用并重新启用Button,则在关闭X后Key Up事件处理程序继续工作 - 我仍然可以通过按下可靠地关闭主窗口Escape键。

显然,我是WPF的新手。我想知道Windows事件是否有一些奇怪的事情发生。

这是主窗口的XAML,后面跟着它的代码。我还包括了Window X的XAML和代码(btw,Window X是WrapPanelWindow)。

<Window x:Class="Wpf_01.MainWindow" x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Wpf_01"
    mc:Ignorable="d"
    Title="Main Window" Height="300" Width="300" Background="#FF6289A4" KeyUp="Key_Up">

<StackPanel Margin="20,10,20,10">
    <Button Content="Canvas Example"/>
    <Button Content="WrapPanel Example" Click="Button_Click"/>
    <Button Content="DockPanel Example"/>
    <Button Content="Grid Example"/>
    <Button Content="StackPanel Example"/>
</StackPanel>

这是主窗口背后的代码:

namespace Wpf_01 {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    internal partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e) {
            Button clickedButton = sender as Button;
            Window newWindow = null;

            switch(clickedButton.Content) {
                case "Canvas Example":
                    newWindow = new CanvasWindow();
                    break;
                case "WrapPanel Example":
                    newWindow = new WrapPanelWindow();
                    break;
            }

            if(newWindow != null) {
                clickedButton.IsEnabled = false;

                newWindow.Show();

                newWindow.Closed += (x, y) => clickedButton.IsEnabled = true;
            }
        } // Button_Clicked()


        private void Key_Up(object sender, KeyEventArgs e) {
            if(e.Key == Key.Escape)
                Close();
        } // KeyHandler()
    }
}

这是WrapPanelWindow XAML和后面的代码:

<Window x:Class="Wpf_01.WrapPanelWindow" x:ClassModifier="internal"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Wpf_01"
        mc:Ignorable="d"
        Title="Fun with WrapPanel Window" Height="200" Width="260">
    <Grid>

    </Grid>
</Window>

最后,WrapPanelWindow的代码背后。

namespace Wpf_01 {
    /// <summary>
    /// Interaction logic for WrapPanelWindow.xaml
    /// </summary>
    internal partial class WrapPanelWindow : Window {
        public WrapPanelWindow() {
            InitializeComponent();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

关闭CanvasWindow时,主窗口无法获得焦点。当您禁用该按钮时,窗口上的任何其他内容都无法调焦。

如果您从Windows任务栏中选择应用程序(最小化和恢复)或切换程序并使用Ctrl + Tab返回它可以正常工作。

重新启用后,尝试给出clickedButton焦点:

            newWindow.Closed += (x, y) =>
            {
                clickedButton.IsEnabled = true;
                clickedButton.Focus();
            };