2011-10-26 19 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

相关问题