2011-08-26 14 views
5

Me pregunto si es posible 'apagar' la ventana principal para que no se cargue automáticamente cuando mi programa comience con un argumento de línea de comandos (es decir, cuando se pasa un nombre de archivo). El problema que tengo es que mi programa se carga cuando se hace clic en un archivo asociado a él, pero lo hace abriendo otra ventana principal y usándola. El problema que tengo es que el programa todavía inicia MainWindow luego, abriendo así dos Windows, uno con el contenido del archivo y otro que está vacío.C# - Programa sin ventana

¿Cómo evito la ventana en blanco? Según lo veo, o bien impido que abra la ventana principal, cierro la ventana principal o hago que el programa pase el archivo a la ventana principal. Mi problema es que no sé cuál de estos sería el mejor o cómo hacerlo.

Este es el código:

protected override void OnStartup(StartupEventArgs e) 
    { 
     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     { 

      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
      MainWindow mw = new MainWindow(); 
      mw.Show(); 
      mw.readVcard(fname); 
      Application.Current.Windows. 
     } 
    } 

EDIT:

Mi solución está en el fondo.

+0

¿Qué parte de leer el argumento de la línea de comando y si tiene algún valor, no mostrar la ventana principal no funciona? –

Respuesta

5

Supongo que usa WPF? Deberá reemplazar el punto de entrada (Principal) que WPF le proporciona. Entonces, puede iniciar WPF o no dependiendo de los argumentos de la línea de comandos. Ver esta cuestión para más información:

Replacing the WPF entry point

6

Creo que puede agregar una clase separada con su propio método Main y establecer que sea el punto de entrada de su ejecutable. Luego puede analizar los argumentos del método y abrir la ventana principal o no.

(Asumo que esto es una aplicación de WPF - es más simple en una aplicación Windows Forms ya que puede modificar el método principal original directamente.)

+0

Gracias. Sí, es WPF. Creo que sigo, comprobaré y volveré en la mañana. – user646265

+0

Consulte la respuesta de Qwertie sobre cómo reemplazar el método 'Principal 'que genera WPF. –

+1

@Merlyn: No es que la respuesta aceptada para la pregunta a la que se hace referencia diga que si bien puede hacer eso, el que responde todavía recomienda crear una clase separada en su lugar :) –

1

me gustaría volver a escribir el código de la siguiente manera:

protected override void OnStartup(StartupEventArgs e) 
{ 
    // start application window 
    MainWindow mw = new MainWindow(); 
    mw.Show(); 
    // store argument and read card info 
    if (e.Args != null && e.Args.Count() > 0) 
    { 
     this.Properties["ArbitraryArgName"] = e.Args[0]; 
     string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
     mw.readVcard(fname); 
    } 
} 

Esto supone que el método MainWindow.readVcard(string) simplemente carga datos en la instancia actual.

1

Hola a todos y gracias por volver a mí, siento que he no regresan más pronto. Parte de lo que dijo Nate era correcto en cuanto a que necesitaba llamar a mi ventana antes y luego, si existía el argumento de la línea de comandos, analizar el nombre del archivo. El problema fue que todavía comenzó una ventana principal después porque eso se estableció como mi inicio, así que usé la información sugerida por Qwertie para alterar mi app.xaml, lo que significaba que apuntaba a una nueva puesta en marcha, que a su vez significaba que la Ventana no se abrió innecesariamente.

En 'App: Aplicación' clase en App.xaml.cs:

private void OnStartUp(object sender, StartupEventArgs e) 
    { 
     OnStartup(e); 
    } 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     MainWindow mw = new MainWindow(); 

     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     //base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     {    
      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 

      mw.Show(); 
      mw.readVcard(fname); 
      //Application curApp = Application.Current; 
      //curApp.Shutdown(); 
     } 

     else if (e.Args.Count() == 0) 
     { 
      mw.Show(); 
     } 
    } 

En App.xaml:

<Application x:Class="Vcardviewer.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
      Startup="OnStartUp" 
      > 
    <Application.Resources> 

    </Application.Resources> 
</Application> 
<!--StartupUri="MainWindow.xaml"--> 

Gracias de nuevo a todos por sus respuestas. Saludos a todos ustedes.

0

Edito la aplicación.xmal para eliminar la URL de inicio. Luego edito el app.xaml.cs y agrego un constructor para la aplicación y hago mi procesamiento allí. Utilizo "Shutdown()" para cerrar la aplicación.

Puede abrir ventanas según sea necesario. Cuando abro otras ventanas, utilizo el evento OnStartup para hacerlo ...

Cuestiones relacionadas