2011-08-26 14 views
5

Mi chiedo se sia possibile "disattivare" la mia finestra principale dal caricamento automatico quando il mio programma inizia con un argomento della riga di comando (ad esempio quando viene passato un nome di file). Il problema che ho è che il mio programma viene caricato quando si fa clic su un file associato, ma lo fa aprendo un'altra finestra principale e usando quella. Il problema che ho è che il programma lancia ancora la MainWindow in seguito, aprendo così due Windows, uno con il contenuto del file e uno vuoto.C# - Programma senza finestra

Come impedire la finestra vuota? Per come la vedo io, non posso impedirmi di aprire la finestra principale, chiudere la finestra principale o far passare il programma alla finestra principale. Il mio problema è che non so quale di questi sarebbe il migliore o come farlo.

Questo è il codice:

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:

La mia soluzione è in fondo.

+0

quale parte della lettura dell'argomento della riga di comando e se è un valore, non mostra la finestra principale non funziona? –

risposta

5

Suppongo tu usi WPF? Dovrai sostituire il punto di ingresso (Principale) che WPF fornisce per te. Quindi, è possibile avviare WPF o meno in base agli argomenti della riga di comando. Vedere questa domanda per ulteriori informazioni:

Replacing the WPF entry point

6

Credo che sia possibile aggiungere una classe separata con il proprio metodo Main e impostare quello per essere il punto di ingresso del file eseguibile. Quindi è possibile analizzare gli argomenti del metodo e richiamare la finestra principale oppure no.

(sto assumendo questo è un applicazione WPF - è più semplice in un'applicazione WinForms, come è possibile modificare direttamente il metodo principale originale.)

+0

Grazie. Sì, è WPF. Penso di seguirmi, controllerò e tornerò al mattino. – user646265

+0

Vedere la risposta di Qwertie su come sostituire il metodo 'Main' generato da WPF. –

+1

@Merlyn: non che la risposta accettata per la domanda di riferimento dica che mentre è possibile farlo, il rispondente consiglia comunque di creare una classe separata, invece :) –

1

Mi piacerebbe riscrivere il codice come segue:

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); 
    } 
} 

Ciò presuppone che il metodo MainWindow.readVcard(string) carichi semplicemente i dati nell'istanza corrente.

1

Ciao a tutti e grazie per tornare a me, mi dispiace ho non tornare presto. Parte di ciò che Nate diceva era corretto in quanto avevo bisogno di chiamare la mia finestra prima e poi, se c'era l'argomento della riga di comando, analizzare il nome del file. Il problema, come ho visto, è che in seguito ha avviato una finestra principale perché è stata impostata come mia startup, quindi ho usato le informazioni suggerite da Qwertie per modificare la mia app.xaml, il che significava che puntava a una diversa startup, che a sua volta significava che la finestra non era stata aperta inutilmente.

In 'App: Application' classe 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(); 
     } 
    } 

In 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"--> 

Grazie ancora a tutti per le risposte. Saluti a tutti voi.

0

Modifica l'app.xmal per rimuovere l'URL iniziale. Quindi modifico l'app.xaml.cs e aggiungo un costruttore per l'app e faccio l'elaborazione lì - Io uso "Shutdown()" per chiudere l'applicazione.

È possibile aprire finestre secondo necessità. Quando lancio altre finestre, utilizzo l'evento OnStartup per farlo ...

Problemi correlati