2011-09-12 18 views
10

Actualmente estoy tratando de usar un componente WPF que hace uso de Application.Current desde una aplicación WPF, sin embargo, debido a varias razones nunca llamo a Application.Run (ni es una opción). El resultado es una NullReferenceException.Application.Current "null" en la aplicación de consola

Básicamente estoy tratando de mostrar varias instancias de la misma ventana de WPF de lo que sería una aplicación de consola. ¡Cualquier consejo (y ejemplos de código en C#/F #) sería bienvenido!

Gracias de antemano

+0

Si no 'Ejecuta()' una aplicación, no tiene una 'Aplicación'. ¿Qué estás haciendo? – SLaks

+1

Aaah, las alegrías de usar controles WPF fuera de una aplicación WPF. – Will

+0

Estoy tratando de mostrar las ventanas de WPF desde una aplicación de consola multiproceso. Los casos de la misma ventana que se muestran varias veces pueden ocurrir y ocurrirán también, ¡así que la situación no es demasiado fácil! :/ – em70

Respuesta

15

sólo para ofrecer una solución alternativa. Es posible mantener una aplicación ejecutándose sin ventanas abiertas. Para mí esto se siente menos 'hackish'. :) http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx

public class AppCode : Application 
{ 
    // Entry point method 
    [STAThread] 
    public static void Main() 
    { 
     AppCode app = new AppCode(); 
     app.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
     app.Run(); 
     ... 
     app.Shutdown(); 
    } 
} 

EDIT: Muy bien, este tiene un poco engorroso. Application.Run bloqueará, por lo que debe ejecutarse en su propio hilo. Cuando se ejecuta en su propio hilo, cualquier interacción entre el hilo principal y el hilo de la interfaz de usuario se debe hacer mejor con Application.Current.Dispatcher.Invoke. Aquí hay un código de trabajo, que supone que tiene una clase que hereda de la aplicación. Estoy usando una App.xaml/App.xaml.cs modificada que una plantilla de proyecto de WPF crea para usted, para obtener un buen manejo de ResourceDictionaries de forma gratuita.

public class Program 
{ 
    // Entry point method 
    [STAThread] 
    public static void Main() 
    { 
    var thread = new System.Threading.Thread(CreateApp); 
    thread.SetApartmentState(System.Threading.ApartmentState.STA); 
    thread.Start(); 

    // This is kinda shoddy, but the thread needs some time 
    // before we can invoke anything on the dispatcher 
    System.Threading.Thread.Sleep(100); 

    // In order to get input from the user, display a 
    // dialog and return the result on the dispatcher 
    var result = (int)Application.Current.Dispatcher.Invoke(new Func<int>(() => 
     { 
      var win = new MainWindow(); 
      win.ShowDialog(); 
      return 10; 
     }), null); 

    // Show something to the user without waiting for a result 
    Application.Current.Dispatcher.Invoke(new Action(() => 
    { 
     var win = new MainWindow(); 
     win.ShowDialog(); 
    }), null); 

    System.Console.WriteLine("result" + result); 
    System.Console.ReadLine(); 

    // This doesn't really seem necessary 
    Application.Current.Dispatcher.InvokeShutdown(); 
    } 

    private static void CreateApp() 
    { 
    App app = new App(); 
    app.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
    app.Run(); 
    } 
} 
+0

Gracias, esto suena bien, sin embargo, en realidad estoy usando el hilo despachador de la ventana oculta para crear y mostrar otras ventanas. ¿Cómo lo haría en tu ejemplo? – em70

+0

@ emaster70 - Editado. Se volvió un poco más engorroso de lo que había pensado ... –

+0

¡Gracias por brindarme una respuesta tan clara! – em70

6

El siguiente es el comportamiento previsto de clase de aplicación:

  • La primera ventana abierta es la MainWindow.
  • La única ventana en la lista se convierte en la ventana principal (si se eliminan otros) ).
  • La clase de aplicación está diseñada para salir si no hay ventanas en la lista de ventanas .

Compruebe esto link.

Así que, básicamente, no se puede ejecutar una aplicación, sin ninguna ventana abierta. Mantenga una ventana abierta pero oculta.


Si he entendido mal su problema, entonces tal vez los siguientes casos similares podrían ayudar:

+0

Terminé corriendo como sugirió una ventana oculta. En el contexto de esa ventana, a través de Dispatcher.Invoke llamadas I instanciar y. Mostrar() las otras ventanas. Eso suena bastante desagradable, pero por el momento funciona :) – em70

+0

Bueno, desde el punto de vista del compilador, su programa sin ventana era desagradable: p – loxxy

Cuestiones relacionadas