Não abrir a mesma janela, se já estiver aberta?
-
segunda-feira, 5 de janeiro de 2009 11:53
Bom dia,
pessoal.
Estou fazendo uma aplicação MDI e estou com um pequeno problema.
Como faço para que não abra a mesma janela mais de uma vez, enquanto o usuário não fechar a 1ª janela?
Respostas
-
segunda-feira, 5 de janeiro de 2009 12:01
-
segunda-feira, 5 de janeiro de 2009 12:15Moderador
Olá Marcelo,Uma forma simples, é apenas guardar uma referência para a janela aberta (se houver):
Code Snippetpublic partial class JanelaPrincipal : Window
{
// Variável da classe que guarda a referência para
// a janela aberta (se estiver, caso contrário, null)
private JanelaFilha janelaFilha;
private void MenuItem_Click(object sender, EventArgs e)
{
// A janela já está aberta?
if (this.janelaFilha != null)
{
// Sim. Então apenas deixe-a ativa (foco)
this.janelaFilha.Activate();
}
else
{
// Não. Então vamos abrir e guardar a referência
this.janelaFilha = new JanelaFilha();
// Vamos reinicializar a variável quando a janela for fechada
this.janelaFilha.Closed += delegate { this.janelaFilha = null; };
// Mostra a janela
this.janelaFilha.Show();
}
}
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com
Todas as Respostas
-
segunda-feira, 5 de janeiro de 2009 12:01
-
segunda-feira, 5 de janeiro de 2009 12:15Moderador
Olá Marcelo,Uma forma simples, é apenas guardar uma referência para a janela aberta (se houver):
Code Snippetpublic partial class JanelaPrincipal : Window
{
// Variável da classe que guarda a referência para
// a janela aberta (se estiver, caso contrário, null)
private JanelaFilha janelaFilha;
private void MenuItem_Click(object sender, EventArgs e)
{
// A janela já está aberta?
if (this.janelaFilha != null)
{
// Sim. Então apenas deixe-a ativa (foco)
this.janelaFilha.Activate();
}
else
{
// Não. Então vamos abrir e guardar a referência
this.janelaFilha = new JanelaFilha();
// Vamos reinicializar a variável quando a janela for fechada
this.janelaFilha.Closed += delegate { this.janelaFilha = null; };
// Mostra a janela
this.janelaFilha.Show();
}
}
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com -
segunda-feira, 5 de janeiro de 2009 13:11
Obrigado pela ajuda pessoal.
Só para entender melhor o padrão singleton, se eu fosse utilizar, eu teria que ter um método estático em cada Form?
-
segunda-feira, 5 de janeiro de 2009 13:34
Você teria uma propriedade estática para retornar a instância. Colando aqui meu exemplo do link:
// Form Singleton public class FormSingleton : Form { private static FormSingleton m_instance = null; // Construtor privado para impedir o instanciamento. private FormSingleton() { } public static FormSingleton Instance { get { if (m_instance == null) { m_instance = new FormSingleton(); } return m_instance; } } // Previne que o método Dispose() seja executado // e o form destruído. Apenas o esconde se houver // tentativa de fechá-lo. protected override void OnClosing(CancelEventArgs e) { this.Hide(); e.Cancel = true; }}
Uso (com um MDI):
FormSingleton f = FormSingleton.Instance;
f.MdiParent = this;
f.Show();Mas como eu disse naquele tópico:
Eu não acho que valha a pena se usar Singletons para forms. Todos os objetos ficarão na memória uma vez instanciados e forms são pesados. É melhor usar a rotina que percorre a coleção de formulários do objeto MDI pai e ver se um formulário em particular já está aberto, como no exemplo acima.
O padrão Singleton é muito útil para outras situações, como, digamos, uma classe que contenha valores globais para um aplicativo etc.. Mas não acho, repito, que valha a pena para instâncias únicas de um Form. Eu usaria a coleção retornada pela propriedade MDIChildren do Form.

