Добавление статического объекта в словарь ресурсов

У меня есть класс, на который ссылаются в нескольких представлениях, но я хотел бы, чтобы среди них был только один экземпляр класса. Я реализовал свой класс так:

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} каждый раз, когда мне нужно сослаться на него.


person Amanduh    schedule 29.04.2011    source источник


Ответы (2)


В XAML это возможно:

<!-- assuming the 'my' namespace contains your singleton -->
<Application.Resources>
   <x:StaticExtension Member="my:Singleton.Instance" x:Key="MySingleton"/>
</Application.Resources>
person Jf Beaulac    schedule 19.10.2012
comment
Я не пробовал это, но MSDN, кажется, предполагает, что ‹ x:Static Member=my:Singleton.Instance x:Key=MySingleton› должен работать, поэтому я просто приму этот ответ. - person Amanduh; 19.10.2012
comment
Если вы хотите объединить его со словарем ресурсов, вам не понадобится ключ. ‹ResourceDictionary.MergedDictionaries› ‹x:Static Member=me:Singleton.Instance/› ‹/ResourceDictionary.MergedDictionaries› - person Craig; 15.08.2014

К сожалению, это невозможно из XAML. Но вы можете добавить объект singleton к ресурсам из кода программной части:

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

        Resources.Add("MySingleton", Singleton.Instance);
    }
}
person Pavlo Glazkov    schedule 29.04.2011
comment
Согласно MSDN, StaticExtension недоступен в клиентском профиле .NET 3.5 или ниже. Для других версий см. версии XAML в другом ответе. - person Alex; 07.10.2013