2011-10-26 15 views
0

我想創建一個自定義導入對話框,因此我創建了一個包含一些內容的窗口。爲了使這個導入對話框模態,我使用ShowDialog()方法。到目前爲止,一切都按預期工作。我的代碼如下所示:在DependencyProperties上使用WPF窗口作爲自定義模態導入對話框失敗

var dialogresult = new MyImportDialog().ShowDialog(); 
if(dialogresult.HasValue && dialogresult.Value) 
{ 
    Console.WriteLine("Import"); 

} 

但是,當我嘗試兩次使用此對話框,有一個ArgumentException的,因爲我的靜態DependencyProperties得到註冊的第二次。所以我試圖不刪除我的導入對話框並再次使用它。

private MyImportDialog _myImportDialog; 

private void OnImportClick(object sender, RoutedEventArgs e) 
{ 
    if (_myImportDialog== null) 
      _myImportDialog= new MyImportDialog(); 

    var dialogresult = _myImportDialog.ShowDialog(); 
    if(dialogresult.HasValue && dialogresult.Value) 
    { 
      Console.WriteLine("Import");    
    } 
} 

現在,我得到一個InvalidOperationException(無法設置可見性或調用Show,ShowDialog的,或WindowInteropHelper.EnsureHandle一個窗口關閉後)。但是ShowDialog方法有一個備註:「打開一個窗口,並且只有當新打開的窗口關閉時才返回。」

所以我的下一個想法是在我的導入對話框中註冊關閉事件,然後取消註冊我的DependecyProperties。不幸的是,沒有官方的做法。我發現的唯一的東西是這樣的:Any way to un-register a WPF dependency property?

但解決方案(在我看來)有點骯髒,作者警告不要在生產環境中使用此代碼。

那麼,有沒有另一種更清潔的解決方案來使用模式窗口兩次?

感謝您的期待。

編輯: 這段代碼顯示一個依賴項屬性我使用:

public DependencyProperty ClearProperty = 
    DependencyProperty.Register("Clear", typeof (bool), 
           typeof (MyImportDialog), 
           new PropertyMetadata(true)); 
    /// <summary> 
    /// Indicates whether view should be cleard before importing new image stack. 
    /// </summary> 
    public bool Clear { 
     get { return (bool) GetValue(ClearProperty); } 
     set { SetValue(ClearProperty, value);} 
    } 
+0

你如何設置窗口的DataContext?你可以發佈你的XAML嗎? –

回答

0

這聽起來像你的靜態依賴屬性沒有被定義爲靜態成員。否則,只有在執行靜態初始化程序時(即第一次引用該類時)纔會初始化它們。你可以粘貼DependencyProperty.Register代碼嗎? DependencyProperty字段應該靜態聲明。

public static DependencyProperty ClearProperty = 
DependencyProperty.Register("Clear", typeof (bool), 
          typeof (MyImportDialog), 
          new PropertyMetadata(true)); 
+0

謝謝,這解決了我的問題。 – 0xBADF00D

+0

好吧,首先我想,如果我聲明我的依賴屬性是靜態的,那麼我不能擁有同一個控件的多個獨立實例。所以我使用Show()方法測試了它,並顯示了兩個非模態對話框。但結果是,每個對話獨立行事。這怎麼可能,但每個使用相同的靜態依賴屬性? – 0xBADF00D

+0

不,DP的定義與其用法無關。 DP是靜態註冊的,所以框架可以用全局方式來標識該屬性,但它是實際存儲值的DependencyObject的實例(例如,每個MyImportDialog都有自己的該屬性值的副本)。 – AndrewS

相關問題