При использовании окна WPF в качестве настраиваемого диалогового окна импорта мод на DependencyProperties происходит сбой - PullRequest
0 голосов
/ 27 октября 2011

Я хочу создать настраиваемое диалоговое окно импорта, и поэтому я создал окно с некоторыми вещами.Чтобы сделать этот диалог импорта модальным, я использую метод 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");              
     }
}

Теперь я получил InvalidOperationException (Невозможно установить Visibility или вызвать Show, ShowDialog или WindowInteropHelper.EnsureHandle после закрытия окна.).Но у метода ShowDialog есть замечание: «Открывает окно и возвращает его только после закрытия вновь открытого окна».

Поэтому моей следующей идеей было зарегистрироваться для закрытия события в моем диалоге импорта, а затем отменить регистрацию моих DependecyProperties.,К сожалению, нет официального способа сделать это.Единственное, что я обнаружил, это: Есть ли способ отменить регистрацию свойства зависимостей WPF? .

Но решение (на мой взгляд) немного грязное, и автор предупредил, что нетиспользовать этот код в продуктивной среде.

Итак, есть ли другое более чистое решение, чтобы дважды использовать модальное окно?

Благодарю вас в ожидании.

Редактировать: Этот код показывает одно свойство зависимости, которое я использую:

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);} 
    }

1 Ответ

0 голосов
/ 27 октября 2011

Похоже, что ваши свойства статической зависимости не определены как статические члены.В противном случае они будут инициализированы только при выполнении статического инициализатора (т.е. при первом обращении к классу).Вы можете вставить код DependencyProperty.Register?Поля DependencyProperty должны объявляться статически.

public static DependencyProperty ClearProperty =  
 DependencyProperty.Register("Clear", typeof (bool), 
                             typeof (MyImportDialog),  
                             new PropertyMetadata(true));
...