3

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

у меня есть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, Есть ли лучший способ сделать это?

  • @Ternary - Вы уверены, что окно & quot; foo & quot; не будет уничтожено до того, как у вашего сопоставленного события будет шанс быть вызванным? Возможно, вам следует подключить Window.Closing (), чтобы увидеть, так ли это.

    от
  • Я попробую это. Но какой смысл закрывать, если есть шанс, что вас никогда не уведомят?

    от Ternary
  • Разница между тем, что я делаю, и той ссылкой, которую вы предоставили, заключается в том, что я пытаюсь обработать закрываемое окно снаружи самого окна (т.е. я не делаю это закрыто). Я обрабатываю его из родительского окна.

    от Ternary
  • Я попробую это сейчас.

    от Ternary
  • Это действительно хороший момент, но документация скудная. Моим первым впечатлением было бы также подумать, что это не так.

    от
  • Это выглядит хорошо, но показывает немного больше контекста. В каком классе находится FooClosed () и где вызывается этот другой код?

    от Henk Holterman
  • Foo : Window случайно не отменяетWindow события, или имеют неявный деструктор / финализатор, не так ли?

    от Alain
  • Видимо код правильный!

    от Rui Gaspar
  • 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();
            }
        }
    }