16 votes

Comment modifier le constructeur MainWindow d'une application WPF ?

Ma fenêtre principale doit s'abonner à certains événements provenant d'un objet. L'objet est initialisé avant la création de la MainWindow. Je voudrais transmettre cet objet à la fenêtre principale via son constructeur.

Cependant, je n'arrive pas à savoir à partir de quel endroit le constructeur de MainWindow est appelé. Alternativement, j'ai essayé de passer l'objet via une fonction membre de la MainWindow, mais la fonction app.MainWindow es null antes de app.Run() est appelé. Après app.Run() est appelé, le code ne revient pas avant la fin du programme.

Une autre possibilité serait de stocker l'objet dans une classe statique et d'y faire accéder la fenêtre principale, mais cela semble inutilement compliqué.

Je me rends compte que je peux simplement créer l'objet dans le constructeur de MainWindow, mais cela signifierait qu'il faudrait y placer beaucoup d'autre code, à peu près toute la fonction Main.

Comment puis-je passer cet objet à ma MainWindow ? Ou bien le constructeur MainWindow est-il censé faire office de "Main" pour l'ensemble du programme ?

27voto

eandersson Points 8571

Vous pourriez le faire comme ça.

Allez d'abord dans App.xaml et supprimez cette ligne StartupUri="MainWindow.xaml" pour empêcher WPF d'afficher automatiquement le MainWindow .

Ensuite, cliquez à droite sur App.xaml et choisissez View Code pour ouvrir App.xaml.cs . À l'intérieur de ce fichier, nous devons remplacer la fonction OnStartup événement.

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
}

À l'intérieur de OnStartup nous pouvons alors instancier notre MainWindow et le montrer.

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    MainWindow mw = new MainWindow();
    mw.Show();
}

Et maintenant nous pouvons utiliser ceci pour charger une alternative Constructor que nous pouvons utiliser pour transmettre plus d'informations.

App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    MainWindow mw = new MainWindow(5);
    mw.Show();
}

MainWindow.xaml.cs

public MainWindow()
{
    InitializeComponent();
}

public MainWindow(int number) : base()
{

}

Je préfère chaîne mon constructeurs mais ce n'est bien sûr pas une obligation, loin s'en faut.

2voto

Kieren Johnstone Points 19499

Vous pouvez définir l'objet comme le DataContext de la MainWindow en le déclarant dans le XAML lui-même. (Si vous essayez de créer un ViewModel, par exemple). Sinon, WPF créera l'instance d'une manière que vous ne pouvez pas contrôler. Vous pourriez mettre votre propre code dans la classe App pour créer et afficher la fenêtre, et supprimer le StartupUri de App.xaml.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X