Evenement c# avec argument WPF

moiii - Modifié par Whismeril le 26/02/2015 à 20:24
 moiii - 27 févr. 2015 à 21:19
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

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
26 févr. 2015 à 18:57
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; )
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
26 févr. 2015 à 20:24
Bonjour, tu peux mettre le xaml?
0
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
27 févr. 2015 à 14:33
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.
0
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.
0
Rejoignez-nous