none
Comunicação entre Janelas RRS feed

  • Pergunta

  • Bom dia a Todos, sou iniciante em WPF e estou com uma dúvida.

    • Eu tenho uma janela principal onde contém um texto.
    • ao clicar em um botão XYZ vou abrir uma Janela de Formatação com as ferramentas para formatar o Texto que está na Janela Principal.
    • após escolher a formatação desejada e clicar em Ok, a janela será fechada e deverá ser aplicada a formação escolhida no texto da Janela Principal.

    "Qual a melhor forma para fazer isto? Estou trabalhando com o FrameWork 4.0"

    Exemplo das Janelas:

    Obrigado a Todos.


    David Ramires

    segunda-feira, 26 de março de 2012 12:18

Respostas


  • Button_Click(sender, events, blábláblá) { try { string texto1 = textBox1.Text; //txt da child string texto2 = textBox2.Text; //txt da child Agendamento agendamento = new Agendamento(); //minha page de baixo //aqui eu pego e passo o texto da minha child para o textboxes da page que esta por baixo agendamento.textBox1.Text = texto1; agendamento.textBox2.Text = texto2; lblStatus.Text = "Adicionado"; } catch { lblStatus.Text = "Complete os dois campos"; } }

    Porém ele nao esta dando certo, vc teria outra ideia ? abraços e obrigado se puder responder !


    Atenciosamente, Guilherme. Caso esta resposta foi útil, por favor, marque como mesma.

    Não funciona pois você está criando uma nova instância Agendamento. Você deve pegar o Agendamento já instanciado. Há várias formas de passar os dados de uma Window para outra. Você pode, por exemplo, passar no construtor da ChildWindow a instância de Agendamento e utilizá-la em qualquer lugar da ChildWindow para alterar os campos de Agendamento.

    Entretanto, uma boa prática é criar eventos.

    Crie uma nova classe que será os parametros do evento:

    public class MyEventArgs : RoutedEventArgs
        {
            public string Texto { get; private set; }
    
            public MyEventArgs(string texto)
            {
                this.Texto = texto;
            }
        }

    Na ChildWindow:

    public delegate void MyEventHandler(object sender, MyEventArgs e);
            public event MyEventHandler DisparaEvento;

    Ainda na ChildWindow, no clique do botão:

    Button_Click(sender, events, blábláblá) {

    //Faz qualquer validação antes de chamar... if(DisparaEvento != null) DisparaEvento(this, new MyEventArgs(textBox1.Text)); //faz qualquer coisa depois que chamar o evento... }

    Agora, na tela que vai chamar a ChildWindow:

    // chamando a childwindow.
    var child = new ChildWindow();
    child.DisparaEvento += this.TrataEvento;
    child.Show();
    
    //cria o método TrataEvento.
    private void TrataEvento(object sender, MyEventArgs e)
    {
       //aqui vc tem todos os parametros de MyEventArgs
       string texto = e.Texto;
    }

    Espero que isso ajude. Qualquer outra dúvida, é só postar.


    WPF FlashMessage: http://goo.gl/bzlX3

    • Sugerido como Resposta Seratti segunda-feira, 23 de abril de 2012 11:27
    • Marcado como Resposta David Ramires segunda-feira, 13 de agosto de 2012 12:51
    sexta-feira, 20 de abril de 2012 20:01

Todas as Respostas

  • Boa tarde David,

    existem diversas forma de fazer essa operação que vocês está querendo, segue abaixo duas delas.

    1. Você pode criar propriedades estáticas no forma principal e populá-las através do form filho.
    2. Você pode utilizar o componente Child Window http://wpftoolkit.codeplex.com/wikipage?title=ChildWindow&referringTitle=Home, esse componente ele abre uma ChildWindow em que você pode utilizar como Modal, ela fica no mesmo XAML que o form que o chama, com isso você consegue compartilhar os valores de seus componentes sem nenhum problema.

    Qualquer dúvida só mandar msg.

    Abraços,

    Daniel Benevides


    Daniel Benevides

    terça-feira, 27 de março de 2012 17:54
  • Daniel, eu estou com o mesmo problema que o David, estou desenvolvendo uma aplicação WINDOWS em C# usando Silverlight, Micro Visual Studio 2010. Vamos lá.

    Tenho uma Page, e nela tenho dois Textboxes, e um Button que chama minha ChildWindow, neste minha Child eu tenho mais dois Textboxes e um Button (adicionar) e um (fechar) correto ?

    Gostaria de saber como fazer para que o texto que eu digitar na minha Child, após o click do button, ele ir automaticamente para a minha textboxes da minha Page, que fica por trás ?

    Tentei usar este código mais nao deu certo:

    Button_Click(sender, events, blábláblá)
    {            
    
    try
                {
                    string texto1 = textBox1.Text; //txt da child
                    string texto2 = textBox2.Text; //txt da child
    
                    Agendamento agendamento = new Agendamento(); //minha page de baixo
    
                   //aqui eu pego e passo o texto da minha child para o textboxes da page que esta por baixo
                    agendamento.textBox1.Text = texto1;
                    agendamento.textBox2.Text = texto2;
    
    
                    lblStatus.Text = "Adicionado";
                }
                catch
                {
                    lblStatus.Text = "Complete os dois campos";
                }
    }

    Porém ele nao esta dando certo, vc teria outra ideia ? abraços e obrigado se puder responder !


    Atenciosamente, Guilherme. Caso esta resposta foi útil, por favor, marque como mesma.

    sexta-feira, 20 de abril de 2012 17:01

  • Button_Click(sender, events, blábláblá) { try { string texto1 = textBox1.Text; //txt da child string texto2 = textBox2.Text; //txt da child Agendamento agendamento = new Agendamento(); //minha page de baixo //aqui eu pego e passo o texto da minha child para o textboxes da page que esta por baixo agendamento.textBox1.Text = texto1; agendamento.textBox2.Text = texto2; lblStatus.Text = "Adicionado"; } catch { lblStatus.Text = "Complete os dois campos"; } }

    Porém ele nao esta dando certo, vc teria outra ideia ? abraços e obrigado se puder responder !


    Atenciosamente, Guilherme. Caso esta resposta foi útil, por favor, marque como mesma.

    Não funciona pois você está criando uma nova instância Agendamento. Você deve pegar o Agendamento já instanciado. Há várias formas de passar os dados de uma Window para outra. Você pode, por exemplo, passar no construtor da ChildWindow a instância de Agendamento e utilizá-la em qualquer lugar da ChildWindow para alterar os campos de Agendamento.

    Entretanto, uma boa prática é criar eventos.

    Crie uma nova classe que será os parametros do evento:

    public class MyEventArgs : RoutedEventArgs
        {
            public string Texto { get; private set; }
    
            public MyEventArgs(string texto)
            {
                this.Texto = texto;
            }
        }

    Na ChildWindow:

    public delegate void MyEventHandler(object sender, MyEventArgs e);
            public event MyEventHandler DisparaEvento;

    Ainda na ChildWindow, no clique do botão:

    Button_Click(sender, events, blábláblá) {

    //Faz qualquer validação antes de chamar... if(DisparaEvento != null) DisparaEvento(this, new MyEventArgs(textBox1.Text)); //faz qualquer coisa depois que chamar o evento... }

    Agora, na tela que vai chamar a ChildWindow:

    // chamando a childwindow.
    var child = new ChildWindow();
    child.DisparaEvento += this.TrataEvento;
    child.Show();
    
    //cria o método TrataEvento.
    private void TrataEvento(object sender, MyEventArgs e)
    {
       //aqui vc tem todos os parametros de MyEventArgs
       string texto = e.Texto;
    }

    Espero que isso ajude. Qualquer outra dúvida, é só postar.


    WPF FlashMessage: http://goo.gl/bzlX3

    • Sugerido como Resposta Seratti segunda-feira, 23 de abril de 2012 11:27
    • Marcado como Resposta David Ramires segunda-feira, 13 de agosto de 2012 12:51
    sexta-feira, 20 de abril de 2012 20:01