WPF窗口关闭事件的使用

4

我有一个Window类(例如public partial class Foo : Window),当我创建窗口时,我注册了Closed事件,如下所示。

foo = new Foo();
foo.Closed += FooClosed;


public void FooClosed(object sender, System.EventArgs e)
{
}

当某人在foo窗口内按下按钮时,我调用this.Close(),但我的FooClosed似乎没有被调用。 我是否错误地注册了事件?
更新
顺便说一下,我想做的就是知道何时关闭了foo,以便我可以将引用设置回null。 有更好的方法来实现吗?

看起来还不错,但是展示一下更多的上下文。FooClosed()在哪个类中?那个其他的代码在哪里调用? - H H
代码显然是正确的! - Rui Gaspar
Foo : Window 有没有覆盖任何 Window 事件,或者有隐式的析构函数/终结器呢? - Alain
1个回答

11

几天前已经回答了这个问题,请查看Execute code when a WPF closes

你的代码可能有一些问题,因为它对我来说可以正常工作。

MainWindow.xaml.cs

namespace WpfApplication1
{

    public partial class MainWindow : Window
    {
        private Foo foo;

        public MainWindow()
        {
            InitializeComponent();

            foo = new Foo();
            foo.Closed += FooClosed;
            foo.Show();
        }

        public void FooClosed(object sender, System.EventArgs e)
        {
            //This gets fired off
            foo = null;
        }

    }
}

Foo.xaml

<Window x:Class="WpfApplication1.Foo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Foo" Height="300" Width="300">
    <Grid>
        <Button Click="Button_Click">Close</Button>
    </Grid>
</Window>

Foo.xaml.cs

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

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

1
我所做的与您提供的链接不同之处在于,我正在尝试处理从窗口外部关闭窗口的情况(即我不是使用 this.closed 进行操作),而是从父窗口进行处理。 - Ternary
@Ternary - 你确定窗口 "foo" 在映射事件被调用之前没有被销毁吗?也许你应该挂钩 Window.Closing() 来查看是否是这种情况。 - Alain
我会尝试一下。但是如果有可能永远不会收到通知,那么关闭的意义在哪里呢? - Ternary
哦,而且感谢你介绍了 foo.Closed += FooClosed; 这种新语法,相比之下,我从来不知道这个快捷方式。我总是只使用 += 然后按下 tab tab,代码就会自动生成。 - Dan P
是的,我本来想建议修改上面的代码,直到你能够找出导致你的代码无法工作的原因。如果你能找出导致“Closed”事件处理程序无法工作的原因,我们可能可以想出一个解决方案。 - Dan P
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接