none
Controles WPF em Windows Forms RRS feed

  • Pergunta

  • Criei um projeto de UserControls de WPF.

    Criei um projeto WinForm.

     

    Coloquei um controle WPF no Form, tudo perfeito até aqui.

     

    Agora eu queria usar um evento que eu criei no UC. Criar o evento é facil, é igual a qualquer outro controle.

    O problema é que no Form você não coloca o controle WPF e sim um ElementHost que tem o controle dentro dele.

     

    Você so consegue usar os eventos do ElementHost e não com filho dele que é o controle.

    Alguém já passou por isso e conseguiu resolver?

     

    sexta-feira, 7 de novembro de 2008 11:58

Respostas

  • No seu UserControl você deve delcarar um Handler que vai expor o evento que vai ser capturado na Form:

     

    public event EventHandler ClickButton;

     

    O que você quer é que quando o botão seja clicado, este eventhandler seja chamado, não? Então você deve criar um manipulador para o evento Click do botão dentro do UserControl semelhante a esse:

     

    private void Button_Click(object sender, RoutedEventArgs e)

    {

      if (ClickButton != null)

        ClickButton(this, new RoutedEventArgs());

    }

     

     

    Desta maneira, se você tiver ligado em sua Form um manipulador ao evento ClickButton do UserControl, ele será chamado quando o botão for clicado. Na Form, você deve fazer algo como:

     

    public Form1()

    {

      InitializeComponent();

      ((UserControl1)elementHost1.Child).ClickButton+=OnClick;

    }

     

    public void OnClick(object sender, EventArgs e)

    {

      MessageBox.Show("Clicou");

    }

     

    Bruno

    sexta-feira, 7 de novembro de 2008 14:29

Todas as Respostas

  • Você usa os eventos do Child do ElementHost.

     

    Por exemplo, se seu UserControl expõe o evento Click, do tipo EventHandler, você pode fazer algo como:

     

    Code Snippet

    ((userControl1)elementHost1.Child).Click += OnClick;

    ....

    public void OnClick(object sender, EventArgs e)

    {

      MessageBox.Show("clicou");

    }

     

     

     

     

    Bruno

     

    sexta-feira, 7 de novembro de 2008 13:34
  • Mas nesse caso eu vou executar ele como um metodo correto?

    Não entendi como no form eu vou declarar o Handler...

     

    Essa é uma declaração o evendo ChildChanged do ElementHost_1

    Code Snippet

    Private Sub ElementHost1_ChildChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.Integration.ChildChangedEventArgs) Handles ElementHost1.ChildChanged

     

    ...

     

    End Sub

     

     

     

    Esse é o codigo do controle

    Code Snippet

    Public Event Fechar()

     

    -----------------------------------------------------------------------------

     

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click

     

    RaiseEvent Fechar()

     

    End Sub

     

     

    Para poder capiturar no form o click do button2 do controle teria que ser alguma coisa assim...

     

    Code Snippet

    Private Sub ElementHost1_Fechar() Handles ElementHost1.Fechar

     

    ....

     

    End Sub

     

     

    Deu para entender o que eu quis dizer?

    sexta-feira, 7 de novembro de 2008 14:11
  • No seu UserControl você deve delcarar um Handler que vai expor o evento que vai ser capturado na Form:

     

    public event EventHandler ClickButton;

     

    O que você quer é que quando o botão seja clicado, este eventhandler seja chamado, não? Então você deve criar um manipulador para o evento Click do botão dentro do UserControl semelhante a esse:

     

    private void Button_Click(object sender, RoutedEventArgs e)

    {

      if (ClickButton != null)

        ClickButton(this, new RoutedEventArgs());

    }

     

     

    Desta maneira, se você tiver ligado em sua Form um manipulador ao evento ClickButton do UserControl, ele será chamado quando o botão for clicado. Na Form, você deve fazer algo como:

     

    public Form1()

    {

      InitializeComponent();

      ((UserControl1)elementHost1.Child).ClickButton+=OnClick;

    }

     

    public void OnClick(object sender, EventArgs e)

    {

      MessageBox.Show("Clicou");

    }

     

    Bruno

    sexta-feira, 7 de novembro de 2008 14:29
  • Não consegui fazer isso que você falou... Não consegui fazer isso aí...

    No meu caso eu uso VB.NET... Talvez seja essa a diferença...

     

     

    Code Snippet

    ((UserControl1)elementHost1.Child).ClickButton+=OnClick;

     

     

    Mas resolvi de outra maneira.

    Quando você coloca um controle no form ele cria no arquivo de designer duas declarações. O ElementHost1 tem um CadastroAcao1 como filho.

     

    Code Snippet

     

    Public WithEvents ElementHost1 As System.Windows.Forms.Integration.ElementHost

    Public CadastroAcao1 As WPFControls.CadastroAcao

     

     

    Basta mudar a declaração da segunda linha para ...

     

    Code Snippet

    Public WithEvents CadastroAcao1 As WPFControls.CadastroAcao

     

     

    Com isso você já pode usar os eventos do UC e não só do ElemenHost.... Fica assim o metodo.

     

    Code Snippet

    Public Sub Fechar() Handles CadastroAcao1.Fechar

    Close()

    End Sub

     

     

    • Sugerido como Resposta Walcyr terça-feira, 20 de outubro de 2009 05:28
    sexta-feira, 7 de novembro de 2008 15:02
  • Bruno, poderia me ajudar com este exemplo que você passou?

    Tentei utilizá-lo tanto em C# quanto em Vb mas sem sucesso.
    O que preciso é exatamente o que você está passando neste exemplo mas como tenho pouco conhecimento não consegui fazer com que funcione.

    Grato!

    Walcyr.
    terça-feira, 20 de outubro de 2009 05:28