我想創建一個自定義導入對話框,因此我創建了一個包含一些內容的窗口。爲了使這個導入對話框模態,我使用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);}
}
你如何設置窗口的DataContext?你可以發佈你的XAML嗎? –