【问题标题】:C# Silverlight - When do Resource Dictionaries get created?C# Silverlight - 何时创建资源字典?
【发布时间】:2011-07-19 17:52:35
【问题描述】:

我正在开发一个 Silverlight 4 项目,在该项目中出现内存泄漏,因为每次加载某些 xaml 视图时,它们都会创建自己的类实例,然后与事件触发器挂钩,并且不会收集垃圾。在这种情况下,删除事件侦听器对我来说太棘手了,无法以这种方式处理。因此,我希望每次加载 xaml 视图时都重新使用该类的实例。

为此,我计划为每个发生此错误的项目添加资源字典。但我担心的是我不知道何时创建此资源字典。当解决方案首次加载时,它会加载项目然后加载资源字典,立即创建类以供使用吗?或者它会等到有东西要求它然后创建它。实际发生的情况是否会创建一个类的副本,供访问它的每个人重复使用(而不是另一个副本)?

我也意识到我可以将资源放在 app.xaml 中,但我需要添加许多这样的类,它确实会弄乱不应该被这个问题困扰的区域。

【问题讨论】:

  • 您是否担心避免分配多个资源字典?
  • 我担心我有一个相当大的项目传递给我,我想保持清洁。在 app.xaml 资源字典中添加大约 16 个元素,这些元素只在一个地方使用,这看起来很脏,如果有人需要找出它们是什么,他们不会先看那里。我知道如何完成任务,我只想将相关数据分组并防止在整个解决方案中分散我需要的东西。不过我一直在阅读,可能只是实现了一个合并字典以使其保持排序。
  • 好吧,如果您在多个地方使用它,除非您采取措施阻止它,否则将分配单独的副本。这就是我问的原因。
  • 资源字典的单独副本还是自定义类的单独副本? MSDN 让我相信资源字典中使用的自定义类将被重用。我认为这意味着类的实际实例将被重用。我打算继续使用 app.xaml 文件实现一个合并字典,除非有人有一个更干净的实现供我使用。并且只需在一个资源字典文件中定义这些类似事物的所有资源。
  • 好的,我已经根据这个讨论发布了答案。

标签: c# silverlight xaml resourcedictionary


【解决方案1】:

使用 Christian Moser 的SharedResourceDictionary 来避免加载字典本身或其包含的任何内容的第二个副本。这为我们节省了大量控件的加载时间。

【讨论】:

  • 我正在阅读该网站上的 cmets,似乎人们在 Silverlight 4 中实现它时遇到了问题,您能否确认它适用于 SL4?由于我的待办事项列表中有一个必要的支线,我还没有机会对其进行测试。
  • 对我来说很好用。为了更深入地为您测试,我刚刚测试了一个 SharedResourceDictionary,其中包含 SL4 中的另一个 SharedResourceDictionary,它发现所有资源都很好。
  • 在实现和检查内存泄漏的过程中(有一个奇怪的错误中断事情)我把 SharedResourceDictionary 作为一个 ResourceDictionary。两者都致力于帮助解决内存泄漏(将其从洪水变成较小的洪水),看起来程度相同。因此,在最新版本的 Silverlight 中,它可能确实为 ResourceDictionary 重用了资源。
  • 不错。我采用两种方式(WPF 和 Sliverlight)并共享很多 Xaml,所以我使用 Shared,因为它确实在 WPF 中节省了很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多