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.
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é
MainWindow
à partir de Window2
?MainWindow
?Si je manque quelque chose, faites le moi savoir. Merci!
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 ).
Passer la fenêtre entière
ce sera MainWindow
Window2 newWindow = new Window2(this);
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.