Come posso modificare il costruttore MainWindow di un’applicazione WPF?

Il mio mainWindow ha bisogno di iscriversi ad alcuni eventi da un object. L’object viene inizializzato prima della creazione di MainWindow. Vorrei passare questo object al mainWindow tramite il suo costruttore.

Tuttavia non riesco a capire da dove viene chiamato il costruttore MainWindow. In alternativa ho provato a passare l’object tramite una funzione membro di MainWindow, ma l’ app.MainWindow è null prima che app.Run() venga chiamata. Dopo l’ app.Run() viene chiamato il codice non ritorna fino alla fine del programma.

Un’altra possibilità sarebbe quella di memorizzare l’object in una class statica e avere l’accesso MainWindow, ma ciò sembra inutilmente complicato.

Mi rendo conto che posso semplicemente creare l’object nel costruttore MainWindow, ma ciò significherebbe dover inserire anche molto altro codice, praticamente l’intera funzione Main.

Come posso passare questo object alla mia MainWindow? Oppure il costruttore MainWindow è destinato a funzionare come “Main” per l’intero programma?

Potresti farlo in questo modo.

Prima vai su App.xaml e rimuovi questa riga StartupUri="MainWindow.xaml" per impedire a WPF di mostrare automaticamente MainWindow .

Quindi fai clic con il pulsante destro del mouse su App.xaml e seleziona View Code per aprire App.xaml.cs All’interno di questo file è necessario eseguire l’ OnStartup dell’evento OnStartup .

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

All’interno di OnStartup possiamo quindi istanziare la nostra MainWindow e mostrarla.

 protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); MainWindow mw = new MainWindow(); mw.Show(); } 

E ora possiamo usarlo per caricare un Constructor alternativo che possiamo usare per trasmettere più informazioni.

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() { } 

Preferisco incatenare i miei costruttori , ma ovviamente non è un requisito in alcun modo.

È ansible impostare l’object come DataContext del MainWindow dichiarandolo nello XAML stesso. (Se si sta tentando di creare un ViewModel, ad esempio). Oltre a ciò, WPF creerà l’istanza in un modo che non puoi controllare. È ansible inserire il proprio codice nella class App per creare e visualizzare la finestra e rimuovere StartupUri da App.xaml.