Evenement c# avec argument WPF

Signaler
-
 moiii -
Bonjour,

Desole, clavier qwertz.

Je suis en WPF.
J'ai une class principale avec juste un bouton et j'ai un usercontrol avec juste une textbox.
Dans la class principale j'utilise naturellement l'événement click du bouton et je voudrais qu'a ce moment ca dit a un autre événement que le clique a lieu et que ce second événement provoque l'affichage d'un text dans la textbox, text défini dans la class principale. Il faut donc passer un parametre (le string qui sera affiche) et qu'il arrive dans la textbox du usercontrol.

Voici mon code :

Class principale :


public partial class MainWindow : Window
 {
  public MainWindow()
  {
   InitializeComponent();
  }

  public delegate void EditMarketingBoxItem(object sender, EventArgs e);
  public event EditMarketingBoxItem Edit = null;

  private void Button_Click(object sender, RoutedEventArgs e)
  {
   if (Edit != null)
    Edit(this, new UserControl1("Ok"));
   
  }
 }



Class du usercontrol :

public partial class UserControl1 : UserControl
 {
  public UserControl1( )
  {
   InitializeComponent();
   MainWindow main = new MainWindow();
   main.Edit += main_Edit;
   
  }

  void main_Edit(object sender, EventArgs e)
  {
   textblock.Text = "Ok";
  }
 
 }



Malheureusement j'ai une boucle infini sur le constructeur du usercontrol et mon application plante. Je doute meme que la base du code est juste.

Pouvez vous m'aider ?

J'ai deja essaye de comprendre les evenements a travers plus de 5 tuto mais impossible pour moi de creer moi meme un evenement personnalise qui envoie quelque chose dans une autre class. Si on m'aide a faire fonctionner ce programme je pense comprendre car j'ai imaginé le fonctionnement moi meme.

Merci d'avance

3 réponses

Messages postés
14743
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 décembre 2020
148
public UserControl1( )
{
...
	MainWindow main = new MainWindow(); 
...
}


Si ton UserControl est contenu (directement ou non) dans MainWindow, c'est normal.
Tu créé MainWindow qui créé UserControl1 qui créé MainWindow, qui créé ...

Essayes de mettre une variable booléenne qui si à true bloque l'execution du gestionnaire d'événement (if (...) return; )
Messages postés
15187
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 décembre 2020
469
Bonjour, tu peux mettre le xaml?
Bonjour

Merci NHenry, effectivement c'etait ca le premier probleme.

MainForm :

public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
		}

		public delegate void EditMarketingBoxItem(string message);
		public event EditMarketingBoxItem Edit = delegate { };

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			UserControl1 usercontrol = new UserControl1();
			grid.Children.Add(usercontrol);
			if (Edit != null)
				Edit("Message");			
		}
	}


<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplicationTestEvenement" x:Name="mainwindows" x:Class="WpfApplicationTestEvenement.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="59,139,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<Grid x:Name="grid" HorizontalAlignment="Left" Height="212" Margin="190,19,0,0" VerticalAlignment="Top" Width="225"/>


<!--<local:UserControl1 HorizontalAlignment="Left" Margin="268,42,0,0" VerticalAlignment="Top"/>-->


</Grid>
</Window>




Le usercontrol :

	public partial class UserControl1 : UserControl
	{
		public UserControl1()
		{
			InitializeComponent();

			MainWindow main = new MainWindow();
			main.Edit += main_Edit;
			
		}

		private void main_Edit(string message)
		{
			textblock.Text = message;
		}
	}




<UserControl x:Class="WpfApplicationTestEvenement.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock x:Name="textblock" HorizontalAlignment="Left" Margin="119,114,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Background="Aqua"/>
</Grid>
</UserControl>



Je n'ai plus la boucle infini, le usercontrol est bien ajoute dans la grille mais private void main_Edit(string message) n'est jamais executé du coup le texte ne change jamais.


Pouvez vous m'aider ? Merci d'avance
Messages postés
14743
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
4 décembre 2020
148
Normal, tu recréé une fenêtre au lieu de t'abonner ? celle déj? présente, regardes du c?té du Design Pattern Singleton pour t'inspirer de la
méthode.
Bonsoir

En faite ça n'a pas été si difficile que ça :)
Il suffit de bien se concentrer au calme et d'étudier quelques tutos et exemples et il est facile de comprendre les événements.

Merci d'avoir trouvé l'origine de la boucle infinie.