2013-04-17 51 views
3

我已經搜索了爲WPF中的窗口創建一個Singleton對象。我們如何爲一個窗口創建一個單例實例?

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

forDefInstance.IsDisposed不工作,並拋出一個錯誤。

對此有何想法?

+3

沒有理由downvote這個問題。從代碼示例中可以清楚地看到他想要做什麼:他希望窗口只打開一次,但也想檢測窗口是否關閉。然後應該可以再次打開它,但絕不應該同時在屏幕上顯示兩個這樣的窗口。我其實覺得這是一個非常有趣的問題! –

+3

@ThorstenDittmar:我不是那個低調的人,但寫着「......不工作並且拋出一個錯誤」*沒有*包括錯誤信息就像是要求被低估。 – Heinzi

+1

@ Heinzi儘管這個問題確實存在,但問題並不完整,我認爲它不值得贊成。 @ OP請添加錯誤信息。 – ken2k

回答

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

然後,只顯示一個窗口,並使用窗口的一個實例。

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

哇!爲什麼波動?單例的目標是創建一次並防止後續的實例創建。'volatile'關鍵字可以創建一個或多個後續實例並將其分配給'DefInstance'。改用'readonly'。 – code4life

+0

該變量被聲明爲volatile以確保在實例變量可以被訪問之前完成對實例變量的賦值 –

+1

'private static readonly DefInstance instance = new DefInstance()'確保線程的安全性和可訪問性,並防止後續寫入。 'volatile'不會。 – code4life

0

我認爲每個人都應該看一看喬恩斯基特的C#在深入現場。如果只是閱讀並永久燒傷他們的大腦單身模式a - la C#。

http://csharpindepth.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> implementions以及該網站的模式的各種其他實現。

相關問題