Wpf 是否有一种安全的方法来分离/卸载行为而不产生副作用?

Wpf 是否有一种安全的方法来分离/卸载行为而不产生副作用?,wpf,xaml,windows-runtime,attachedbehaviors,Wpf,Xaml,Windows Runtime,Attachedbehaviors,在WPF和WinRT中,众所周知,行为不能可靠地调用其分离方法。避免内存泄漏的唯一方法是订阅AssociatedObject的已卸载事件并取消所有事件的挂钩() 到目前为止,它是有效的 但我意识到(就像其他人对我链接的博客条目发表评论一样),这样卸载的行为就再也不会被附加。以菜单为例。如果存在附加到MenuFlyoutItem的行为,则会在MenuFlyoutItem关闭时卸载该行为。如果再次打开菜单,它将不会被重新连接 其他用户控件也会发生这种情况。当我在WinRT应用程序中从一个页面导航到另

在WPF和WinRT中,众所周知,行为不能可靠地调用其分离方法。避免内存泄漏的唯一方法是订阅AssociatedObject的已卸载事件并取消所有事件的挂钩()

到目前为止,它是有效的

但我意识到(就像其他人对我链接的博客条目发表评论一样),这样卸载的行为就再也不会被附加。以菜单为例。如果存在附加到MenuFlyoutItem的行为,则会在MenuFlyoutItem关闭时卸载该行为。如果再次打开菜单,它将不会被重新连接

其他用户控件也会发生这种情况。当我在WinRT应用程序中从一个页面导航到另一个页面并再次导航时,我会“丢失”行为,尽管所有控件都会重新创建。我不知道如何在WinRT应用程序中使用它们,在WinRT应用程序中,许多控件都是通过导航重新创建的


有什么解决方案吗?

非常感谢@Justin XL,微软已经更新了UWP的行为SDK,并使其开源。新库修复了导航分离问题!:)


也许我遗漏了什么,但如果你在卸载时分离,你不也需要在装载时连接吗?@McGarnagle谢谢你的评论。因为我的行为是在Xaml中创建的,所以我无法控制它们的附加时间。保留引用以便稍后再次手动附加它们本身可能是内存泄漏的原因。此外,除了在代码中创建新的行为之外,我还不知道该怎么做。@Massimocachiotti,修复很简单-再等10天,新的UWP行为SDK就会发布。:)目前,问题在于旧版本(8.1)。在新版本中,
Detach
函数将被正确调用(是的,我已经对它进行了测试)。这是个好消息,谢谢@Justin XL!!:)我从他们那里获得了预发布sdk。:)很抱歉,我不能分享它,但如果你现在想测试它,也许可以让Unni给你发送预发布链接。