4

我已经搜索了为 WPF 中的窗口创建单例对象。

public static Test DefInstance
{
    get
    {
        if (formDefInstance == null)  // formDefInstance.IsDisposed
        {
            initializingDefInstance = true;
            formDefInstance = new cas18();
            initializingDefInstance = false;
        }
        return formDefInstance;
    }
    set { formDefInstance = value; }
}

但是forDefInstance.IsDisposed它不起作用并引发错误。

关于这个有什么想法吗?

4

3 回答 3

0

我不知道这是否是您想要做的,但它对我有用:

private static MyWindow _defInstance;
public static MyWindow DefInstance
{
    get
    {
        if (null == _defInstance)
        {
            _defInstance = new MyWindow();
        }
        return _defInstance;
    }
 }

在 MyWindow 代码中:

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    this.Visibility = Visibility.Hidden;
    e.Cancel = true;
}

要使用它:

DefInstance.Show();

然后,只显示一个窗口,您使用窗口的一个实例。

于 2013-04-18T14:18:03.463 回答
0

我认为每个人都应该看看 Jon Skeet 的 C# In Depth 站点。如果只是为了阅读并永久地在他们的大脑中燃烧单例模式 a-la C#。

http://cshapindepth.com/Articles/General/Singleton.aspx

在您的场景中,尝试实现这个(线程安全,非懒惰):

public sealed class DefInstance
{
  private static readonly DefInstance instance = new DefInstance();
  static DefInstance()
  {
  }

  private DefInstance()
  {
  }

  public static DefInstance Instance
  {
    get
    {
      return instance;
    }
   }
} 

该站点中还有Lazy<T>该模式的实现和各种其他实现。

于 2013-04-18T14:34:04.903 回答
-2

您可以通过实现以下方法来实现这一点

private static volatile DefInstance instance;
private static object syncRoot = new Object();

private DefInstance() {}

public static DefInstance Instance
{
   get 
   {
      if (instance == null) 
      {
         lock (syncRoot) 
         {
            if (instance == null) 
               instance = new DefInstance();
         }
      }

      return instance;
   }
}
于 2013-04-18T14:28:28.387 回答