【问题标题】:Is there a safe way to detach/unload behaviors without side effects?有没有一种安全的方法来分离/卸载行为而没有副作用?
【发布时间】:2014-07-08 18:44:46
【问题描述】:

众所周知,在 WPF 和 WinRT 中,行为不会可靠地调用它们的 Detach 方法。避免内存泄漏的唯一方法是订阅 AssociatedObject 的 Unloaded 事件并取消挂钩所有事件 (example)。

到目前为止它有效。

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

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

有没有已知的解决方案?

【问题讨论】:

  • 也许我遗漏了一些东西,但如果你在卸载时分离,你是否也只需要在加载时附加?
  • @McGarnagle 感谢您的评论。由于我的行为是在 Xaml 中创建的,因此我无法控制它们的附加时间。持有一个引用以在以后再次手动附加它们本身可能是内存泄漏的原因。此外,如果不在代码中创建新行为,我不确定如何做到这一点。
  • @MassimoCacchiotti,修复很简单 - 再等 10 天,让新的 UWP 行为 SDK 发布。 :) 目前问题出在旧版本(8.1)上。在新版本中,Detach函数将被正确调用(是的,我已经测试过了)。
  • 这真是个好消息,谢谢@Justin XL! :)
  • twitter.com/unnir/status/667005259730948096 我从他们那里得到了预发布的 sdk。 :) 对不起,我不能分享它,但如果你想现在测试它,也许要求 Unni 将预发布链接发送给你。

标签: wpf xaml windows-runtime attachedbehaviors


【解决方案1】:

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

http://blogs.windows.com/buildingapps/2015/11/30/xaml-behaviors-open-source-and-on-uwp/

https://twitter.com/hashtag/BehaviorsGoOpenSource?src=hash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多