我有一个FooUserControl
订阅了它的LoadedEvent
。此UserControl
可以放置在GUI上的其他位置(在任何Window
上或任何Control
的内部)。为了避免泄漏,我已经实施了某种处置方法。
此解决方案的问题:
如果将FooUserControl
放在TabItem
的TabControl
上并更改选项卡,则会调用OnVisualParentChanged()
并处理订阅。如果我不添加此方法,并且您关闭了TabItem
,尽管可以处置UserControl
,但订阅仍在后台运行。 page
也会出现同样的问题>
public class FooUserControl : UserControl
{
private IDisposable _Subscription;
public FooUserControl()
{
Loaded += _OnLoaded;
}
private void _OnLoaded(object sender, RoutedEventArgs e)
{
// avoid multiple subscribing
Loaded -= _OnLoaded;
// add hook to parent window to dispose subscription
var parentWindow = Window.GetWindow(this);
if(parentWindow != null)
parentWindow.Closed += _ParentWindowOnClosed;
_Subscription = MyObservableInstance.Subscribe(...);
}
private void _ParentWindowOnClosed(object? sender, EventArgs e)
{
_Dispose();
}
// check if the parent visual has been changed
// can happen if you use the control on a page
protected override void OnVisualParentChanged(DependencyObject oldParent)
{
if (oldParent != null)
{
_Dispose();
}
base.OnVisualParentChanged(oldParent);
}
private void _Dispose()
{
_Subscription?.Dispose();
}
}
我有一个FooUserControl,它订阅了它的LoadedEvent。该UserControl可以放置在GUI上的其他位置(在任何Window或任何Control内部)。为避免泄漏,我已经实现了一些...
我终于找到了解决方案。在UnLoaded
事件中,如果仍然存在实例,我将扫描Logical/VisualTree
。