Usuário com melhor resposta
Comunicação entre Janelas

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
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
Todas as Respostas
-
Boa tarde David,
existem diversas forma de fazer essa operação que vocês está querendo, segue abaixo duas delas.
- Você pode criar propriedades estáticas no forma principal e populá-las através do form filho.
- 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
-
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.
-
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