使用WPF窗口作为自定义模式导入对话框失败,具体取决于DependencyProperties
我想创建一个自定义的导入对话框,因此我用一些东西创建了一个窗口。为了使这个导入对话框成为模态,我使用ShowDialog方法。到目前为止,一切正常。我的代码如下所示:使用WPF窗口作为自定义模式导入对话框失败,具体取决于DependencyProperties,wpf,modal-dialog,dependency-properties,Wpf,Modal Dialog,Dependency Properties,我想创建一个自定义的导入对话框,因此我用一些东西创建了一个窗口。为了使这个导入对话框成为模态,我使用ShowDialog方法。到目前为止,一切正常。我的代码如下所示: var dialogresult = new MyImportDialog().ShowDialog(); if(dialogresult.HasValue && dialogresult.Value) { Console.WriteLine("Import"); } 但是,当我尝试使用此对话框两次时,得
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");
}
}
现在我得到了一个无效的操作异常无法设置可见性或调用Show、ShowDialog或WindowInteropHelper.EnsureHandle在窗口关闭后进行处理。。但是ShowDialog方法有一个注释:打开一个窗口,并且仅当新打开的窗口关闭时返回
因此,我的下一个想法是在导入对话框中注册关闭事件,然后注销DependecProperties。不幸的是,没有官方的方式来做这件事。我唯一找到的是这个:
但在我看来,解决方案有点脏,作者警告不要在生产环境中使用此代码
那么,是否有另一种更干净的解决方案可以使用模态窗口两次呢
提前感谢你
编辑:
此代码显示了我正在使用的一个依赖项属性:
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);}
}
听起来您的静态依赖属性没有定义为静态成员。否则,只有在执行静态初始值设定项时,即第一次引用类时,才会初始化它们。你能粘贴DependencyProperty.Register代码吗?DependencyProperty字段应该是静态声明的
public static DependencyProperty ClearProperty =
DependencyProperty.Register("Clear", typeof (bool),
typeof (MyImportDialog),
new PropertyMetadata(true));
如何设置窗口的DataContext?你能发布你的XAML吗?好的,首先我想,如果我声明我的依赖属性为static,我就不能有同一个控件的多个独立实例。因此,我使用Show方法和显示两个非模态对话框对其进行了测试。但结果是,每个对话框都是独立的。这怎么可能,但是每个都使用相同的静态依赖属性?不,DP的定义与其用途无关。DP是静态注册的,因此框架可以有一个全局方法来标识该属性,但实际上存储值的是DependencyObjects的实例,例如,每个MyImportDialog都有其自己的属性值副本。好的,这是否意味着如果我使用SetValue,此方法不会将值写入依赖项属性。相反,它将值写入MyImportDialog中的某种隐藏属性,可能是DependencyObject中的哈希集,方法是使用dependency属性作为标识符。好的,谢谢!我还没有仔细研究它们是如何存储值的。在内部,我相信DependencyObject维护一个有效的ValueEntry数组,该数组维护值和全局唯一的整数,该整数标识DependencyProperty,我认为DP的DependencyProperty是作为其GlobalIndex公开的。