我想创建一个自定义导入对话框,因此我创建了一个包含一些内容的窗口。为了使这个导入对话框模态,我使用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吗? –