2012-04-15 12 views
15

La mia mainWindow deve iscriversi ad alcuni eventi da un oggetto. L'oggetto viene inizializzato prima della creazione di MainWindow. Vorrei passare questo oggetto al mainWindow tramite il suo costruttore.Come si modifica il costruttore MainWindow di un'applicazione WPF?

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

Un'altra possibilità è quella di memorizzare l'oggetto in una classe statica e avere l'accesso MainWindow, ma ciò sembra inutilmente complicato.

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

Come posso passare questo oggetto alla mia MainWindow? Oppure il costruttore MainWindow è destinato a funzionare come "Main" per l'intero programma?

risposta

23

Si potrebbe fare così.

Prima andare in App.xaml e rimuovere questa riga StartupUri="MainWindow.xaml" per impedire a WPF di visualizzare automaticamente il numero MainWindow.

Fare clic con il pulsante destro del mouse su App.xaml e selezionare View Code per aprire App.xaml.cs. All'interno di questo file è necessario eseguire l'override dell'evento OnStartup.

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

All'interno OnStartup allora possiamo istanziare la nostra MainWindow e mostrarlo.

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

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

E ora possiamo usare questo per caricare un'alternativa Constructor che possiamo utilizzare per trasmettere ulteriori 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 chain mia constructors, ma è ovviamente non è un requisito con qualsiasi mezzo.

+0

Grazie, questo funziona come un fascino. Ciò significa che la funzione 'OnStartup' è più o meno il' Principale', a meno che non sia sottoclasse 'StartupEventArgs' e che tutto il necessario sia presente in' Main'.Immagino che in realtà non sia importante, sono solo abituato al C++. –

2

È possibile impostare l'oggetto 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. È possibile inserire il proprio codice nella classe App per creare e visualizzare la finestra e rimuovere StartupUri da App.xaml.

+0

L'uso di 'DataContext' è la via da seguire in WPF, specialmente se si desidera utilizzare modelli più avanzati come ad esempio' MVVM' in seguito. – eandersson

+0

Grazie per la risposta, accetterò la risposta di Fuji poiché è un po 'più ampia. –

Problemi correlati