2014-03-04 22 views
0

我自定義MessageBox,在MessageBox.cs。在MainWindow中,如果單擊名爲Open Two MessageBox的按鈕,則將分別開始運行兩個BackgroundWorker,分別睡眠2000ms和1000ms,並顯示MessageBoxes。但是你可以發現:異步顯示自定義MessageBox,然後在最上面的MessageBox中的所有按鈕

enter image description here

在MessageBox1按鈕進入MessageBox2。我不知道這是爲什麼?

這些按鈕被創建並保存在MessageBoxModule的CtrlButtonCollection中。

我會因這個問題而發瘋。

由於項目中有很多代碼,所以我把它放在GitHub中。

The project in GitHub

回答

1

您應該始終使用避免初始化依賴項屬性的默認元數據中的引用類型。由於DP標識符註冊是靜態的,所以這個參考將在MessageBox的所有實例中共享。

public static DependencyProperty CtrlButtonCollectionProperty = 
      DependencyProperty.Register(
       "CtrlButtonCollection", 
       typeof(IList<Button>), 
       typeof(MessageBoxModule), 
       new PropertyMetadata(new List<Button>())); <-- HERE 

使用其他重載,你不需要通過默認的元數據或傳遞null是所有引用類型默認值即聲明是這樣的:

public static DependencyProperty CtrlButtonCollectionProperty = 
      DependencyProperty.Register(
       "CtrlButtonCollection", 
       typeof(IList<Button>), 
       typeof(MessageBoxModule)); 

,做初始化在其構造:

public MessageBoxModule 
{ 
    ..... 
    CtrlButtonCollectionProperty = new List<Button>(); 
    ..... 
} 
+0

非常感謝。我需要更多地瞭解DP。 – SubmarineX

2

你MessageBoxModule.CtrlButtonCollectionProperty是靜態的,所以,它只會註冊一次,你就會有相同的列表()爲所有你創建的消息框。

使用非靜態DependencyProperty來解決這個問題。 (我也考慮重寫整個事情)。

+0

如果使用非靜態DependencyProperty,vs會報錯。你怎麼? – SubmarineX