WPF c# et xaml

WPF c# et xaml - C#/.NET managed - Programmation

Marsh Posté le 06-10-2015 à 22:04:36    

Bonjour à tous,
Je fait actuellement un petit logiciel tout simple et du coup, pour me faire la main, j'ai décidé de passer au WPF. Jusqu'ici tout va bien, j'ai créer une interface et j'ai même réussi à faire en sorte que si l'utilisateur clique sur un bouton un onglet se cré. (Ce qui est déjà une victoire en soi!!). Maintenant je voudrais savoir comment faire pour remplir cette "page" avec un formulaire (des boutons où je veux, des champs à remplir où je veux...)
Je pensais soit c'est possible directement par le code C# mais je vois pas comment définir et placer les composants, soit "préfabriquer" les onglets dont j'ai besoin en xaml et les "incruster" dans l'onglet au moment de la création. Mais ça non plus je sais pas comment le mettre en place.  
Merci pour votre aide.  
Pour info, j'ai pas mal cherché sur Google et autre et j'ai pas trouvé de réponse qui me conviennes (et oui j'ai vu le MVVM mais ça me fait un peu l'impression de prendre un semi remorque pour trimbaler un paquet de mouchoir!!)
Encore merci
Nico

Reply

Marsh Posté le 06-10-2015 à 22:04:36   

Reply

Marsh Posté le 10-10-2015 à 13:05:35    

Tu dois avoir un tas de réponses en cherchant dans un moteur de recherche sur "wpf dynamic control creation" et on ne peut pas te pondre des réponses de 3 pages pour une chose sur laquelle tu trouveras plein de tutos, donc il faudrait que tu précises un peu la question et/ou les soucis rencontrés.
 
Outre la creation dynamique tu devrais regarder aussi les custom controls, user controls et cie.
 
Pas besoin de MVVM effectivement.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-10-2015 à 01:28:28    

Merci pour ta réponse. Je vais creuser ce "dynamic control creation".  
J'ai commencé à regarder les user control et mon soucis concerne la récupération d'événements.  
Par exemple : l'utilisateur souhaite compléter les infos d'un contact inscrit dans la bdd. Il clique sur un bouton pour faire apparaître un onglet comprenant les informations du contact. Ce formulaire "n'existe pas" à l'ouverture, je pensais faire un user control comprenant tous les champs et boutons nécessaires. Maintenant la question est comment pré remplir ce formulaire avec les infos du contact et surtout mettre à jour la base en cliquant sur un bouton.  
Encore merci pour les réponses.

Reply

Marsh Posté le 12-10-2015 à 22:44:03    

Alors j'ai creusé les évènements sur les usercontrol. J'ai fait une petite appli test avec un usercontrol comprenant un bouton et un label. J'ai mis une propriété publique pour pouvoir modifier le contenu de mon label.  
Sur ma fenêtre j'ai juste un bouton. Si je clique sur mon bouton, le user control est ajouté et je peux l'ajouter plusieurs fois.
Quand je clique sur le bouton d'un des usercontrol ainsi ajouté, l'évènement est reconnu.
Maintenant j'aimerais pouvoir savoir  quel bouton a été sollicité et modifier le label lié.
Pourriez vous m'aider ?
 
Voila mon code du usercontrol :

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. namespace WpfApplication2
  16. {
  17.     /// <summary>
  18.     /// Logique d'interaction pour UserControl1.xaml
  19.     /// </summary>
  20.     public partial class UserControl1 : UserControl
  21.     {
  22.         public event EventHandler<EventArgs> buttonClick;
  23.         public UserControl1()
  24.         {
  25.             InitializeComponent();
  26.         }
  27.         private void btn_UC_Click(object sender, RoutedEventArgs e)
  28.         {
  29.             if (buttonClick != null)
  30.                 buttonClick.Invoke(sender, EventArgs.Empty);
  31.         }
  32.         public string Title
  33.         {
  34.             get { return this.lbl_titre.Content.ToString(); }
  35.             set { this.lbl_titre.Content = value.ToString(); }
  36.         }
  37.     }
  38. }


 
Le code xaml :

Code :
  1. <UserControl x:Class="WpfApplication2.UserControl1"
  2.              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5.              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6.              mc:Ignorable="d"
  7.              d:DesignHeight="46" d:DesignWidth="300">
  8.     <Grid>
  9.         <StackPanel Orientation="Vertical">
  10.             <Label Name="lbl_titre">Test de mon user control</Label>
  11.             <Button Name="btn_UC" Click="btn_UC_Click">Mon bouton</Button>
  12.         </StackPanel>
  13.     </Grid>
  14. </UserControl>


 
Le code xcml de la fenêtre:

Code :
  1. <Window x:Class="WpfApplication2.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:my="clr-namespace:WpfApplication2"
  5.         Title="MainWindow" Height="350" Width="525" WindowStartupLocation="CenterScreen">
  6.     <Grid>
  7.         <StackPanel Orientation="Vertical" Name="stk1">
  8.             <Button Name="btn_new" Click="btn_new_Click">Nouveau bouton</Button>
  9.         </StackPanel>
  10.     </Grid>
  11. </Window>


 
Le code cs qui va avec :

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Data;
  9. using System.Windows.Documents;
  10. using System.Windows.Input;
  11. using System.Windows.Media;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Navigation;
  14. using System.Windows.Shapes;
  15. namespace WpfApplication2
  16. {
  17.     /// <summary>
  18.     /// Logique d'interaction pour MainWindow.xaml
  19.     /// </summary>
  20.     public partial class MainWindow : Window
  21.     {
  22.         public MainWindow()
  23.         {
  24.             InitializeComponent();
  25.         }
  26.         int i = 0;
  27.        
  28.         private void btn_new_Click(object sender, RoutedEventArgs e)
  29.         {
  30.            
  31.             UserControl1 Uc = new UserControl1();
  32.             Uc.Name = "Uc" + i.ToString();
  33.             Uc.Title = "Test de mon UC";
  34.             Uc.buttonClick += new EventHandler<EventArgs>(Uc_btn_Click);
  35.             stk1.Children.Add(Uc);
  36.             i += 1;
  37.         }
  38.         void Uc_btn_Click(object sender, EventArgs e)
  39.         {
  40.             MessageBox.Show("GREAT JOB" );
  41.         }
  42.     }
  43. }

Reply

Marsh Posté le 13-10-2015 à 09:25:13    

Y a de l'idée. C'est assez compliqué comme mise en oeuvre pour un truc aussi simple mais on sent que tu comprends et applique les concepts, c'est bien.
 
Pour info au lieu de              
Uc.buttonClick += new EventHandler<EventArgs>(Uc_btn_Click);
tu peux juste écrire              
Uc.buttonClick += Uc_btn_Click;
Ca revient au même.
 
Idem pour buttonClick.Invoke(sender, EventArgs.Empty);
Qui peut juste s'écrire buttonClick(sender, EventArgs.Empty);
 
Concernant ta question, tu peux par exemple utiliser l'EventArgs pour passer des infos supplémentaires.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 16-10-2015 à 20:02:03    

Salut, j'ai creusé les EventArgs mais j'ai vraiment du mal à trouvé un tuto "simple". Je voudrais juste récupérer le Uid de mon usercontrol inséré dynamiquement. J'avoue que je veux bien un petit coup de main!!
Merci d'avance.

Reply

Marsh Posté le 17-10-2015 à 09:08:21    

Après plusieurs test infructueux, je me rend compte que le Uid ne va pas me servir. En fait j'aimerais que lors du clique, je puisse récupérer le nom du usercontrol afin d'agir sur ce qu'il y a à l'intérieur comme, dans mon exemple, changer la valeur du label. Une fois que j'aurais compris ça, j'essaierai de faire pareil mais en récupérant la valeur d'une textbox qui sera à la place de mon label. Merci pour votre aide.


Message édité par NicoLag le 17-10-2015 à 09:08:47
Reply

Marsh Posté le 17-10-2015 à 10:48:12    

Heureusement la débilité n'est mortelle ! (Sinon l'enterrement aurait eu lieu lundi !!) Quand je lis 15fois que le usercontrol est autonome ça veut peut être dire qu'il est... Autonome!!! Du coup dans l'événement click de mon bouton a l'intérieur du usercontrol, je lui dit quoi faire sur le usercontrol et ça fonctionne!!! Merci pour votre aide

Reply

Marsh Posté le 17-10-2015 à 14:47:06    

Oui effectivement, rien ne t'oblige à propager l'événement pour le gérer depuis ta feuille parente comme tu le faisais plus haut, tu peux très bien le gérer localement si ça te permet de faire ce que tu veux.  
Ca dépend complètement de l'utilisation, mais propager a aussi son utilité.  
 
N'hésite pas à l'avenir. Tu peux aussi venir poser tes questions dans le topic en lien dans ma signature si tu veux.


---------------
Topic .Net - C# @ Prog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed