Вопрос по events, wpf, c# – Окно WPF Использование закрытых событий

3

у меня есть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 кажется, не называется.

Я неправильно регистрируюсь на событие?

Update

Кстати, все, что я пытаюсь сделать, этоknow когдаfoo был закрыт, поэтому я могу установить ссылку обратноnull, Есть ли лучший способ сделать это?

Видимо код правильный! Rui Gaspar
Это выглядит хорошо, но показывает немного больше контекста. В каком классе находится FooClosed () и где вызывается этот другой код? Henk Holterman
Foo : Window случайно не отменяетWindow события, или имеют неявный деструктор / финализатор, не так ли? Alain

Ваш Ответ

1   ответ
10

Выполнить код при закрытии WPF

Возможно, что-то происходит с вашим кодом, потому что это прекрасно работает для меня.

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
Разница между тем, что я делаю, и той ссылкой, которую вы предоставили, заключается в том, что я пытаюсь обработать закрываемое окно снаружи самого окна (т.е. я не делаю это закрыто). Я обрабатываю его из родительского окна. Ternary
Я попробую это. Но какой смысл закрывать, если есть шанс, что вас никогда не уведомят? Ternary
@Ternary - Вы уверены, что окно & quot; foo & quot; не будет уничтожено до того, как у вашего сопоставленного события будет шанс быть вызванным? Возможно, вам следует подключить Window.Closing (), чтобы увидеть, так ли это.
Это действительно хороший момент, но документация скудная. Моим первым впечатлением было бы также подумать, что это не так.

Похожие вопросы