2009-08-06 5 views
2

У меня есть экземпляр Window, который я показываю, вызывая wInstance.ShowDialog() нажатием кнопки, и я закрываю окно, нажимая Alt + F4. Проблема в том, что я не могу снова вызвать wInstance.ShowDialog(). Как я могу повторно использовать один и тот же экземпляр окна снова.Есть ли способ повторного использования уже закрытого экземпляра окна WPF

Исключение: Невозможно установить Видимость или вызов Show или ShowDialog после закрытия окна.

+0

Возможный дубликат [WPF: не может повторно использовать окно после его закрытия] (http://stackoverflow.com/questions/3568233/wpf-cannot-reuse-window-after-it-has-been-closed) – nemesv

+0

Это не может быть дубликат нового сообщения ... неужели этот пост является дубликатом этого? – Sheridan

ответ

9

Вам необходимо переопределить метод wInstance OnClosing, чтобы установить видимость окна в скрытое и отменить событие закрытия.

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     this.Visibility = Visibility.Hidden; 
     e.Cancel = true; 
    } 
+0

Спасибо, Мартин, это ответ на вопрос, который я задавал себе на днях. – Dennis

+0

У меня такая же проблема, и хотя это остановило исключение, когда я снова пытаюсь использовать окно, это препятствует тому, чтобы ShowDialog() возвращал true, когда я ожидал. Есть ли у вас какие-либо предложения по этому поводу? –

+0

Возврат ShowDialog() указывает, как было удалено диалоговое окно. Если эта информация важна для вас, тогда вам нужно будет фактически удалить окно, когда оно будет закрыто, поэтому вы не должны отменять событие закрытия, а вместо этого создавайте экземпляр нового окна, когда вы хотите его снова открыть. Если информация о состоянии окна важна, рассмотрите схему памяти. –

1

Что именно это делает настолько важным, чтобы использовать одно и то же окно? Если вы используете MVVM, вы можете просто повторно использовать viewmodel для нового окна.

+0

Но я хочу, чтобы исключить стоимость создания нового экземпляра Window. Поэтому проверьте, есть ли область повторного использования и снова используйте ShowDialog(). –

+0

Является ли ваше окно таким дорогим? – Botz3000

+0

Ответ Мартина Домса правильный, но мне очень любопытно этот вопрос. Возможно ли, что вы переоцениваете накладные расходы на создание этого представления, особенно если вы используете MVVM и поддерживаете виртуальную машину? –

0

Я повторно использовать окно как диалог, который использует TreeView и клиент хочет, чтобы ветви дерев, чтобы оставаться открытыми в течение нескольких выборов.

Переопределение работало для повторного использования, а ветви остаются расширенными.

Я не использую модель представления, чтобы она была простой, поскольку это диалог выбора только для чтения. Но, поскольку я пока не могу очистить выбор, мне, возможно, придется переключиться на модель представления.

Смежные вопросы