Usuário com melhor resposta
Controles WPF em Windows Forms

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?
Respostas
-
No seu UserControl você deve delcarar um Handler que vai expor o evento que vai ser capturado na Form:
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:
{
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:
{
InitializeComponent();
((
UserControl1)elementHost1.Child).ClickButton+=OnClick;}
{
MessageBox.Show("Clicou");}
Bruno
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
-
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 SnippetPrivate 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 SnippetPublic
Event Fechar()-----------------------------------------------------------------------------
RaiseEvent Fechar()
Para poder capiturar no form o click do button2 do controle teria que ser alguma coisa assim...
Code SnippetPrivate Sub ElementHost1_Fechar() Handles ElementHost1.Fechar
....
End Sub
Deu para entender o que eu quis dizer?
-
No seu UserControl você deve delcarar um Handler que vai expor o evento que vai ser capturado na Form:
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:
{
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:
{
InitializeComponent();
((
UserControl1)elementHost1.Child).ClickButton+=OnClick;}
{
MessageBox.Show("Clicou");}
Bruno
-
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 SnippetPublic WithEvents ElementHost1 As System.Windows.Forms.Integration.ElementHost
Public CadastroAcao1 As WPFControls.CadastroAcao
Basta mudar a declaração da segunda linha para ...
Code SnippetPublic
WithEvents CadastroAcao1 As WPFControls.CadastroAcaoCom isso você já pode usar os eventos do UC e não só do ElemenHost.... Fica assim o metodo.
Code SnippetPublic Sub Fechar() Handles CadastroAcao1.Fechar
Close()
End Sub
- Sugerido como Resposta Walcyr terça-feira, 20 de outubro de 2009 05:28
-
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.