向资源字典添加静态对象

16

我有一个类在多个视图中被引用,但我希望它们之间只有一个类的实例共享。我已经按照以下方式实现了我的类:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}
有没有一种方法可以将Singleton.Instance作为资源添加到我的资源字典中?我想写类似于
<Window.Resources>
    <my:Singleton.Instance x:Key="MySingleton"/>
</Window.Resources>

我每次需要引用它时,不必再写{x:static my:Singleton.Instance}

2个回答

20

在XAML中可以实现:

<!-- assuming the 'my' namespace contains your singleton -->
<Application.Resources>
   <x:StaticExtension Member="my:Singleton.Instance" x:Key="MySingleton"/>
</Application.Resources>

我没有尝试过这个,但是MSDN似乎表明<x:Static Member="my:Singleton.Instance" x:Key="MySingleton">应该可以工作,所以我只是接受了这个答案。 - Amanduh
如果你的目标是将其合并到资源字典中,那么你就不需要键。<ResourceDictionary.MergedDictionaries> <x:Static Member="me:Singleton.Instance"/> </ResourceDictionary.MergedDictionaries> - Craig

5

很遗憾,这在XAML中不可能实现。但是您可以从代码后台将单例对象添加到资源中:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e) {
        base.OnStartup(e);

        Resources.Add("MySingleton", Singleton.Instance);
    }
}

2
根据MSDN的说明,StaticExtension在.NET Client Profile 3.5或更低版本中不可用。对于其他版本,请参见其他答案中的XAML版本。 - Alex

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