2012-04-15 11 views
15

Mi mainWindow necesita suscribirse a algunos eventos de un objeto. El objeto se inicializa antes de que se cree MainWindow. Me gustaría pasar este objeto a la ventana principal a través de su constructor.¿Cómo edito el constructor MainWindow de una aplicación WPF?

Sin embargo, no puedo entender desde dónde se llama al constructor MainWindow. Alternativamente traté de pasar el objeto a través de una función miembro de MainWindow, pero el app.MainWindow es null antes de llamar al app.Run(). Después de llamar al app.Run(), el código no se devuelve hasta que finaliza el programa.

Otra posibilidad sería almacenar el objeto en una clase estática y tener acceso a MainWindow, pero esto parece innecesariamente complicado.

Me doy cuenta de que puedo simplemente crear el objeto en el constructor MainWindow, pero eso significaría tener que poner allí muchos otros códigos, prácticamente toda la función Main.

¿Cómo puedo pasar este objeto a mi ventana principal? ¿O está previsto que el constructor MainWindow funcione como el 'Principal' para todo el programa?

Respuesta

23

Puede hacerlo así.

Primero vaya a App.xaml y elimine esta línea StartupUri="MainWindow.xaml" para evitar que WPF muestre automáticamente MainWindow.

A continuación, haga clic derecho en App.xaml y elija View Code para abrir App.xaml.cs. Dentro de este archivo debemos sobrescribir el evento OnStartup.

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

Dentro OnStartup entonces podemos crear una instancia de nuestra MainWindow y mostrarla.

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

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

Y ahora podemos usar esto para cargar una alternativa Constructor que podemos utilizar para transmitir más información.

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

} 

prefiero chain mi constructors, pero es, por supuesto, no es un requisito por cualquier medio.

+0

Gracias, esto funciona como un encanto. Aún así, esto significa que la función 'OnStartup' es prácticamente la' Main', a menos que subclass' StartupEventArgs' y coloque todo lo que necesita de 'Main' allí.Supongo que en realidad no importa, solo estoy acostumbrado a C++. –

2

Puede establecer el objeto como DataContext de MainWindow declarándolo en el propio XAML. (Si está intentando crear un ViewModel, por ejemplo). Aparte de eso, WPF creará la instancia de una manera que no puede controlar. Puede poner su propio código en la clase de la aplicación para crear y visualizar la ventana, y eliminar el StartupUri de App.xaml.

+0

El uso de 'DataContext' es el camino a seguir en WPF, especialmente si desea utilizar patrones más avanzados como, por ejemplo,' MVVM' más adelante. – eandersson

+0

Gracias por responder, aceptaré la respuesta de Fuji ya que es un poco más extensa. –

Cuestiones relacionadas