Visual Studio Developer Center > Fóruns do Visual Studio > C# > Não abrir a mesma janela, se já estiver aberta?

Respondido 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

Todas as Respostas

  • segunda-feira, 5 de janeiro de 2009 12:01
     
     Respondido
  • segunda-feira, 5 de janeiro de 2009 12:15
    Moderador
     
     Respondido
     Olá Marcelo,

     

    Uma forma simples, é apenas guardar uma referência para a janela aberta (se houver):

     

    Code Snippet

     

     public 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.