Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为窗口创建一个单例实例?_C#_Wpf_C# 4.0_Singleton - Fatal编程技术网

C# 如何为窗口创建一个单例实例?

C# 如何为窗口创建一个单例实例?,c#,wpf,c#-4.0,singleton,C#,Wpf,C# 4.0,Singleton,我已经搜索过在WPF中为窗口创建单例对象 公共静态测试定义 { 得到 { if(formDefInstance==null)//formDefInstance.IsDisposed { 初始化定义状态=真; FormDefinition=新cas18(); 初始化定义状态=false; } 返回定义状态; } 设置{formDefInstance=value;} } 但是efinstance.IsDisposed的不起作用并引发错误 对此有什么想法吗?我不知道这是不是你想做的,但对我来说很有用

我已经搜索过在WPF中为窗口创建单例对象

公共静态测试定义
{
得到
{
if(formDefInstance==null)//formDefInstance.IsDisposed
{
初始化定义状态=真;
FormDefinition=新cas18();
初始化定义状态=false;
}
返回定义状态;
}
设置{formDefInstance=value;}
}
但是efinstance.IsDisposed的
不起作用并引发错误


对此有什么想法吗?

我不知道这是不是你想做的,但对我来说很有用:

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();

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

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

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;
   }
}

我想每个人都应该看看Jon Skeet的C#Depth网站。如果只是为了阅读并永久性地在他们的大脑中燃烧,单身汉们就会发出一声“a-la C”

在您的场景中,尝试实现这一点(线程安全、非惰性):


该站点中也有懒惰的
实现和该模式的各种其他实现。

没有理由否决这个问题。从代码示例中可以很清楚地看出他想要做什么:他希望窗口只打开一次,但也希望检测窗口是否关闭。然后应该可以再次打开它,但屏幕上永远不应该同时有两个这样的窗口。我真的认为这是一个非常有趣的问题@ThorstenDittmar:我不是投否决票的人,但是写下“……不起作用,并且抛出错误”而不包含错误信息就像要求投否决票一样。@Heinzi虽然这个问题确实不完整,但我认为它不值得投否决票。@OP请添加错误消息。窗口类(WPF)中没有
IsDisposed
属性。你说的是winforms吗?@ThorstenDittmar/ken2k:我怀疑这是对的——我想这是一个合理的理由来否决这个问题,至少在没有编辑或OP澄清的情况下。(我自己没有否决,但我知道为什么人们会这么做。)哇!为什么不稳定?singleton的目标是创建一次实例并防止随后创建实例。使用
volatile
关键字可以创建一个或多个后续实例,并将其分配给
DefInstance
。改为使用
readonly
。将变量声明为易失性,以确保在可以访问实例变量之前完成对实例变量的赋值
private static readonly DefInstance instance=new DefInstance()
确保线程安全和可访问性,并防止后续写入
volatile
没有。请阅读此问题答案,然后您将能够知道我提到使用volatile的原因。。我在示例中提到了双重检查锁定方法。。有关此概念的更多信息,请参阅本文档
public sealed class DefInstance
{
  private static readonly DefInstance instance = new DefInstance();
  static DefInstance()
  {
  }

  private DefInstance()
  {
  }

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