我有一个包含自定义用户控件的窗口。 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()
。有什么想法吗?
事实证明这个问题中的答案也为我解决了问题。不过,Unloaded 事件没有被触发,这似乎仍然很奇怪。去算算吧。
在 MyWindow 类中
this.Closing += new System.ComponentModel.CancelEventHandler(Window1_Closing);
void Window1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
call User Control Method()
}
为什么不将处理程序连接到 window.Closed 事件?您的 UserControl 可以遍历 ui 树来查找窗口。
尝试了多种方法后,我想出了这个:
将其添加到您的 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();
}