WPF Window.Close() 不触发 UserControl.Unloaded 事件

问题描述 投票:0回答:4

我有一个包含自定义用户控件的窗口。 UserControl 需要知道包含它的窗口何时关闭,以便它可以终止线程。

我对如何完成此操作的最佳猜测是处理 UserControl 的 Unloaded 事件。但是,Unloaded 事件似乎仅在用户实际单击关闭窗口时触发,而不是在我以编程方式调用窗口上的 Close() 方法时触发。

为了参考,这里是我的代码的一些相关部分。

MyWindow.xaml:

<Window x:Class="Namespace.MyWindow"
        xmlns:controls="clr-namespace:Namespace.Controls">
    <controls:MyControl/>
</Window>

MyControl.xaml:

<UserControl x:Class="Namespace.Controls.MyControl"
             Unloaded="UserControl_Unloaded"/>
    <!-- Stuff -->
</UserControl>

MyControl.xaml.cs:

void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
    // Stop the thread.
}

简单回顾一下,当我“手动”关闭窗口(alt-F4,单击红色“X”等)时,上面的 UserControl_Unloaded() 方法就会被调用,但当我从代码中的其他地方调用时则不会被调用

 myWindow.Close()
。有什么想法吗?

wpf events user-controls
4个回答
13
投票

事实证明这个问题中的答案也为我解决了问题。不过,Unloaded 事件没有被触发,这似乎仍然很奇怪。去算算吧。


2
投票

在 MyWindow 类中

this.Closing += new System.ComponentModel.CancelEventHandler(Window1_Closing);


void Window1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            call User Control Method()

        }

1
投票

为什么不将处理程序连接到 window.Closed 事件?您的 UserControl 可以遍历 ui 树来查找窗口。


0
投票

尝试了多种方法后,我想出了这个:

将其添加到您的 MainPage.xaml.cs 文件中:

public static MainPage shutdown;

之后:

this.InitializeComponent();

添加:

shutdown = this;

并添加此:

public void closingpage(object sender, RoutedEventArgs e)
{
    //your closing routine
}

在您的 App.xaml.cs 文件中:

添加:

MainPage.shutdown.closingpage(null, null);

这里:

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    MainPage.shutdown.closingpage(null, null);
    deferral.Complete();
}
© www.soinside.com 2019 - 2024. All rights reserved.