2013-09-06 14 views
5

Sto sviluppando un'applicazione WPF e ho bisogno di ottenere un punto nella finestra principale dell'applicazione all'interno di un controllo. Sto usando Caliburn Micro.Applicazione MainWindow è nullo in WPF (utilizzando Caliburn Micro)

Application.Current.MainWindow è null

Come posso ottenere un riferimento al MainWindow di applicazione in Caliburn Micro?

risposta

12

Questo è divertente, ho appena risposto in un altro post ... provare a impostare la proprietà Application.Current.MainWindow in caso Loaded nel file MainWindow.xaml.cs:

private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    Application.Current.MainWindow = this; 
} 
+0

È divertente, ho appena visto quel post pochi minuti fa. –

+0

Ho appena provato questo, prima di impostarlo ho controllato ed è stato impostato (ma impostato di nuovo), ma in seguito è nuovamente nullo, qualsiasi idea di cosa potrebbe causarlo? Per quanto posso vedere, la mia applicazione non lo ha mai impostato, quindi esiste uno scenario generico WPF che potrebbe impostarlo su null? –

+0

Mi spiace, ma non sono a conoscenza di alcuna situazione in cui ciò potrebbe accadere ... non mi è mai successo, ma se stai usando qualsiasi framework di terze parti, potrebbero farlo per qualche motivo. – Sheridan

3

1. Comprensione del Application.Current.MainWindow

Quando l'applicazione apre la prima finestra (MainWindow.xaml), la finestra viene impostata su Application.Current.MainWindow. Quando la finestra è chiusa, un'altra finestra attualmente aperta è impostata su Application.Current.MainWindow. Se non ci sono finestre aperte, Application.Current.MainWindow è impostato su null.

ad es. se apri LoginWindow all'avvio, Application.Current.MainWindow sarà LoginWindow. Quando si chiude LoginWindow, quindi Application.Current.MainWindow può essere Window1 per esempio.

2. Accedere esempio MainWindow

se si desidera accedere a un'istanza della classe MainWindow si dovrebbe fare seguente: Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();

tuttavia, se MainWindow non è aperto, allora verrà restituito nulla. Non tentare di risolvere il problema: se MainWindow non è ancora aperto, o è già chiuso, non dovresti accedervi.

3. MVVM

nel modello MVVM, non si dovrebbe accedere vista direttamente dal tuo ViewModel. Se lo facessi, interromperesti i principali problemi MVVM, come Separazione delle preoccupazioni, testabilità, ecc. Ecc. La domanda è allora, perché vuoi mvvm.

Se si desidera eseguire un'azione in MainWindow, è necessario eseguire l'azione su MainWindowViewModel. Se la finestra è aperta, rifletterà le modifiche in ViewModel. Se non lo è, allora il cambiamento non deve essere riflesso. MainWindowViewModel non dovrebbe avere un riferimento diretto all'istanza MainWindow.

+0

Ho poca esperienza con WPF, ma le informazioni nel secondo punto sembrano imprecise.Non penso che "la classe MainWindow" esista in WPF e, [la documentazione dice esplicitamente] che il primo elemento Application.Windows non è necessariamente la finestra principale: "Se MainWindow viene successivamente impostato con un riferimento a una finestra diversa, la posizione di l'elemento con il riferimento alla finestra principale cambierà, mentre l'ordine degli elementi in Windows rimarrà lo stesso. Di conseguenza, usa sempre MainWindow per fare riferimento alla finestra principale anziché al primo elemento di Windows. " –

+0

@ TomaszMaczyński: risolto, grazie! Era solo un problema formativo. L'argomento del tipo qui 'OfType ()' è la parte difficile che mancava – Liero