2010-11-10 6 views
0

У меня есть главное окно wpf, в этом окне я создаю новые подчиненные окна и добавляю в словаре. Возможно, после закрытия ведомого окна он еще раз показал.reloaded wpf window

public class MainWindow:Window 
{ 
private dictionary<string, SlaveWindow> _winDic= new dictionary<string, SlaveWindow>(); 

public void SomeMethod() 
{ 

var mySlaveWindow = new SlaveWindow(); 
//add to dictionary 
_winDic.Add("mySlaveWindow",w); 

//close slave window w 


//show 
_winDic[mySlaveWindow].Show(); 
} 
} 

ответ

1

Это делается следующим образом: this msdn страница.

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

private bool m_close = false; 
// Shadow Window.Close to make sure we bypass the Hide call in 
// the Closing event handler 
public new void Close() 
{ 
    m_close = true; 
    base.Close(); 
} 
private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    // If Close() was called, close the window (instead of hiding it) 
    if (m_close == true) 
    { 
     return; 
    } 
    // Hide the window (instead of closing it) 
    e.Cancel = true; 
    this.Hide(); 
} 

Это позволит убедиться, что ваше Окно, наконец, закрывается и не остается висящим.

+0

Некоторые вопросы: 1) Я не понимаю, почему только один из них использует Dispatcher.BeginInvoke - если первый нужен, не нужен ли ему второй пример? 2) не должен ли ваш второй пример вызывать base.OnClosing и 3) любое преимущество использования Visibility, а не Hide(), которое более описывает то, что делается? –

+0

Хорошие вопросы. Я не делал этот код сам, но я считаю, что Dispatcher.BeginInvoke используется, чтобы избежать «InvalidOperationException - отображается видимость, или Show, ShowDialog или Close вызывается, когда окно закрывается» здесь http: // msdn.microsoft.com/en-us/library/system.windows.window.closing(v=VS.90).aspx. Согласен (а), скрыть() более описательно. Я также обновил свой ответ на то, что Microsoft рекомендует по этой ссылке. http://msdn.microsoft.com/en-us/library/cc656741(VS.90).aspx –

+0

Спасибо, Мелейк, это очень хороший пример. – 2010-11-11 08:46:03

0

Вам нужно будет скрыть окно, а не закрывать его.

Если вы позвоните Hide(), окно будет исчезать, как если бы вы звонили Close(), но вы сможете отправить его позже, снова позвонив по телефону Show().

+0

К сожалению, это не работает для верхней кнопки «Закрыть». –

+0

Да, я слишком точно интерпретировал этот вопрос. Я взял комментарий в коде, в котором говорится, что «закрыть рабочую область w» означает, что он собирался закрыть окно из кода. –