Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用WPF窗口作为自定义模式导入对话框失败,具体取决于DependencyProperties_Wpf_Modal Dialog_Dependency Properties - Fatal编程技术网

使用WPF窗口作为自定义模式导入对话框失败,具体取决于DependencyProperties

使用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"); } 但是,当我尝试使用此对话框两次时,得

我想创建一个自定义的导入对话框,因此我用一些东西创建了一个窗口。为了使这个导入对话框成为模态,我使用ShowDialog方法。到目前为止,一切正常。我的代码如下所示:

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公开的。