【问题标题】:WPF Window Closed Event UsageWPF 窗口关闭事件用法
【发布时间】:2012-04-05 17:58:53
【问题描述】:

我有一个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() 在哪个类中,其他代码在哪里调用?
  • 显然代码是正确的!
  • Foo : Window 不会覆盖任何 Window 事件,或者具有隐式析构函数/终结器,是吗?

标签: c# wpf events


【解决方案1】:

问题已于几天前得到解答,请查看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();
        }
    }
}

【讨论】:

  • 我正在做的事情与您提供的链接之间的区别是我正在尝试处理从窗口本身外部关闭的窗口(即我没有这样做。关闭)我是从父窗口处理它。
  • @Ternary - 你确定在你的映射事件有机会被调用之前窗口“foo”没有被破坏吗?也许你应该挂钩 Window.Closing() 看看是否是这种情况。
  • 我会试试的。但是,如果您有可能永远不会收到通知,那么 Closed 的意义何在?
  • 这是一个非常好的观点,但文档很少。我的第一印象也是认为情况并非如此。
  • 哦,感谢 foo.Closed += FooClosed; 的新语法与新的 EventHandler 方法相反。我从来没有意识到那条捷径。我总是只使用 += 并点击标签选项卡,代码是自动为我生成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多