2015-08-25 13 views
5

Mi piacerebbe avere un singolo file eseguibile che posso usare per aprire un'app grafica (il caso d'uso predefinito, quando si fa clic sull'exe), o che posso usare per eseguire le attività da riga di comando.Wpf e app di comando nello stesso file eseguibile

È possibile?

In tal caso, come dovrei modificare la mia app.xaml/app.xaml.cs in modo che apra solo la vista grafica su condizioni specifiche (ad esempio, nessun parametro della riga di comando)?

+0

È possibile passare un flag per indicare la modalità della riga di comando e, quando presente, utilizzare AttachConsole per collegare l'app alla console che l'ha lanciata. Vedi http: //www.codeproject.it/Tips/68979/Attaching-a-Console-to-a-WinForms-application per esempio – user469104

risposta

5

Per prima cosa è necessario utilizzare un progetto di applicazione WPF e modificare app.xml in modo da poter eseguire l'override della creazione della finestra.

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication1"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

Nota che manca la proprietà StartupUri.

Poi, sul App.xaml.cs si può fare qualcosa di simile:

public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 

      if (condition) 
      { 
       var window = new MainWindow(); 

       window.ShowDialog(); 
      } 
      else 
      { 
       AllocConsole(); 
      } 
     } 

     [DllImport("Kernel32.dll")] 
     static extern void AllocConsole(); 
    } 
2

È possibile controllare se l'applicazione è stata eseguita da una console. In caso contrario, è possibile allocare dinamicamente una console:

if (GetConsoleWindow() == IntPtr.Zero) 
    AllocConsole(); 

dove

[DllImport("kernel32.dll")] 
public static extern IntPtr GetConsoleWindow(); 

[DllImport("kernel32.dll")] 
public static extern bool AllocConsole(); 
+0

Se l'app è stata avviata dalla console ma non ha ricevuto alcun parametro della riga di comando, voglio comunque aprire la finestra .... – Wilbert

+0

Fallo e basta. :) È necessario prima controllare i parametri della riga di comando, quindi. Ad ogni modo, prima di assegnare una console potresti verificare se l'app ne ha già una. – taffer

2

@ risposta di BrunoKlein funziona, e ho basato la mia risposta alla sua soluzione. Citando @BrunoKlein,

Per prima cosa devi utilizzare un progetto di applicazione WPF e modificare l'app.xaml in modo da poter sostituire la creazione della finestra.

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication1"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

Nota che questa non è presente la proprietà StartupUri.

Ora, ancora più semplice (questo funziona in Visual Studio 2015 almeno), andare alle proprietà del progetto, e cambiare il tipo di uscita da Windows Application per Applicazione console. Ciò rende il progetto costruito come app per console, ma ha ancora le capacità di un'applicazione Windows.

Windows Application (Class Library è evidenziato in questa foto, selezionare Applicazione Console invece)

l'avete fatto! Fatto.

Ora, invece di avere un void Main(string[] args), il metodo "principale" è il metodo della vostra autogenerata App classe OnStautup:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     string[] args = e.Args; 

     if (SomeConditionBasedOnTheArgs(args)) 
     { 
      // Instantiate view, call View.Show() 
     } 
     else 
     { 
      // Process the args 
     } 
    } 
} 

Nota l'unica differenza tra questa risposta, e @ risposta di BrunoKlein è che questo lo farà sempre "mostra" una console se viene eseguita da explorer/start menu/desktop, ma se viene eseguita dalla riga di comando, eseguirà e dirige tutto il suo output standard su quella console, proprio come qualsiasi normale applicazione console.