web-dev-qa-db-fra.com

Comment dois-je transmettre des données entre Windows WPF impliquant `MainWindow` (C #)?

Je commence actuellement un projet C # dans lequel je modélise un simple guichet automatique et aurai donc besoin de plusieurs écrans. J'ai rencontré le problème de la transmission de données entre les écrans auparavant lorsque je codais une adaptation de jeu de société StockTicker, mais je ne pense pas que ma méthode de résolution de cette question était très bonne.

Beaucoup de mes problèmes viennent du fait que j'utilise MainWindow comme fenêtre principale de l'application. Je peux facilement transmettre des données de la fenêtre secondaire à la fenêtre principale, car je peux accéder aux propriétés de la classe Window1 après sa fermeture. Cependant, pour passer de MainWindow à Window2, je dois ajouter un paramètre au constructeur de Window2 qui me permettra de transmettre les valeurs nécessaires.

Bien que cela fonctionne pour une petite application, j’estime que cela deviendrait très long/compliqué pour le plus de choses qui doivent être passées à Window2. De plus, je ne sais pas du tout comment accéder aux méthodes que je déclare sur MainWindow à partir de Window2. Puisque MainWindow est l'écran principal, la plupart de mes codages sont dans sa classe.

  • Comment puis-je accéder à une méthode que j'ai mise dans MainWindow à partir de Window2 ??

(À des fins d'éclaircissement) J'ai passé un certain temps à regarder autour de moi et je ne peux pas trouver un exemple clair impliquant spécifiquement MainWindow et nécessitant l'accès à des variables/méthodes trouvées.


Dans cet exemple, je montre simplement que j'ai trouvé un moyen de transférer des données d'un formulaire à l'autre, mais je suis sûr qu'il existe un meilleur moyen. En particulier, je suis sûr qu’il existe un moyen plus agréable que de devoir éventuellement coder différents constructeurs avec différents paramètres pour la classe Window2.


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

        private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
        {
            string strForm1Text = txtForm1TextBox.Text;

            Window2 newWindow = new Window2(strForm1Text);
            newWindow.ShowDialog();

            txtForm2TextBox.Text = newWindow.strForm2Text;
        }
    }
}

Deuxième code de fenêtre WPF:

namespace Banking_System
{
    public partial class Window2 : Window
    {
        public string strForm2Text { get; set; }

        public Window2(string form1)
        {
            InitializeComponent();

            txtForm1.Text = form1;
        }

        private void btnSwitchBack_Click(object sender, RoutedEventArgs e)
        {
            strForm2Text = txtForm2TextBox.Text;
            this.Close();
        }
    }
}

Aurais-je intérêt à créer une autre fenêtre WPF et à la charger dès que la variable MainWindow est chargée, puis à masquer MainWindow et à "prétendre" que l'autre fenêtre était l'écran principal? Parce qu'alors, je pouvais simplement accéder aux propriétés de la même manière que ci-dessus (lors du transfert de Window2 à MainWindow).

c'est à dire. Si vous avez besoin d'accéder à une variable/méthode depuis une autre fenêtre, déclarez simplement une nouvelle fenêtre temporaire et accédez à ses propriétés/méthodes:

FakeMainWindow wndPrimary = new FakeMainWindow();
wndPrimary.strProperty= "test";
wndPrimary.methodCall();

Le principal intérêt de cette méthode pour moi est que je peux accéder aux méthodes sur une autre fenêtre (comme illustré ci-dessus), ce que je ne peux pas faire en utilisant MainWindow comme ma forme principale.

Résumé

  • Comment puis-je accéder à une méthode que j'ai mise dans MainWindow à partir de Window2?
  • Est-il préférable de créer une autre fenêtre WPF et de prétendre que c'est mon "écran principal" pour pouvoir accéder facilement à ses propriétés?
  • Sinon, y a-t-il une meilleure façon de travailler avec MainWindow?

Si je manque quelque chose, faites le moi savoir. Merci!

6
Kendall Roth

Vous pouvez réellement accéder à la fenêtre principale de votre application sans passer de références entre fenêtres. Application.Current.MainWindow renvoie l'instance de la fenêtre principale déclarée dans app.xaml. Il retourne une Window (d'où provient votre fenêtre principale), vous devrez donc le lancer pour accéder à ses membres.

Par exemple, vous pouvez utiliser ce code dans votre deuxième fenêtre:

((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";

Ceci dit, je vous suggère de faire des recherches sur les modèles de conception de WPF (en particulier MVVM ).

10
learningcs

Passer la fenêtre entière
ce sera MainWindow

Window2 newWindow = new Window2(this);
1
paparazzo

Vous pouvez définir la première fenêtre en tant que DataContext de la deuxième fenêtre:

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

        private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
        {               
            Window2 newWindow = new Window2(strForm1Text);
            newWindow.DataContext = this;
            newWindow.ShowDialog();      
        }            
  }

 public partial class MainWindow2 : Window
 {
      public MainWindow2()
      {
         var window1 = this.DataContext;
      }
 }  

}

De plus, je recommanderais que votre fenêtre ait son propre ViewModel défini en tant que DataContext que vous pouvez envoyer à l'autre fenêtre. De cette façon, vous pouvez également lier des propriétés directement aux deux fenêtres sans vous soucier de les mettre à jour manuellement. 

1
eran otzap