在WPF中,是否有一种方法可以在控件卸载之前执行代码...?例如卸载事件?

9

我需要在WPF用户控件卸载之前执行代码,并在满足某些条件时取消卸载,使控件在UI中保持打开状态...

有什么办法可以实现吗?我没找到类似于卸载事件的东西?


1
对于这个问题,你有什么具体使用场景吗?听起来你想要类似于Window.Closing的功能,但这与取消FrameworkElement.Unloaded事件是很不一样的。当一个元素被卸载时,其父元素和兄弟元素的布局可能会发生很多变化。 - John Bowen
我有一个类似的问题,万一你能帮我。 - Juan
3个回答

7

Unloaded事件在WPF可视化树中移除控件时触发。据我所知,与Windows Forms不同的是,WPF中没有"Unloading"事件。但是,"Unloaded"并不意味着控件被销毁,只是从可视化树中移除。

在代码中将控件及其父控件的一些元数据保存在单独的位置,并通过在Initialized事件处理程序中存储对Parent属性的引用来收集这些元数据。

然后,在调用Unloaded时,在Unloaded事件处理程序中进行测试,如果满足条件,则重新将控件插入逻辑树中。 ContentControl类有一个显式的AddChild受保护方法,您可以调用该方法。

可能会有一些副作用需要注意; 根据文档,在操作系统级别更改主题或WPF可视化树重新构建时,将调用Unloaded事件。


0

在System.Windows.Controls.Control上有一个Unloaded事件,但我不知道如何优雅地停止使用它卸载控件。


是的,我知道卸载事件,但根据某些条件,我需要阻止它被卸载... - guest
它必须是一个UserControl吗?或者你可以使用一个模态对话框,如果某些条件不满足就不关闭它? - andyp

-1
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
     if (ConditionsMet) { e.Handled = true; }
}

如果满足条件,Unloaded事件将被设置为true,因此您的控件将保留在VisualTree中 - 您的控件不会被卸载。

2
这在我的测试中不起作用。似乎忽略了e.Handled = true;。 - OfficeAddinDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接