No Main () in WPF?


128

Sono un principiante quando si tratta di programmazione, ma ero sicuro che una delle regole universali fosse che un programma inizia con Main (). Non ne vedo uno quando creo un progetto WPF. Main () è semplicemente chiamato in modo diverso in WPF?


13
È possibile ottenere la funzionalità equivalente sovrascrivendo OnStartup in App.xaml.cs. StartupEventArgs.Args contiene gli argomenti della riga di comando.
Foole,

1
@Foole, no, non puoi, vedi questa domanda.
Sinatr,

Risposte:


73

Viene generato durante la compilazione, ma è possibile fornire il proprio (chiarendolo in base alle proprietà del progetto, se necessario). Cerca in obj / debug un file app; Ho (per gentile concessione di "C # 2010 Express") App.g.i.cscon:

namespace WpfApplication1 {


    /// <summary>
    /// App
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public partial class App : System.Windows.Application {

        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public void InitializeComponent() {

            #line 4 "..\..\..\App.xaml"
            this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);

            #line default
            #line hidden
        }

        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public static void Main() {
            WpfApplication1.App app = new WpfApplication1.App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

1
La stessa cosa esiste App.g.csanche in. Ma ho provato ad aggiungere Main()e ogni volta che avrei ricostruito il mio progetto, sarebbe tornato a quello che hai, qui. Ho provato a crearne uno mio in un'altra classe, ma Project Properties trova solo MyProject.App, non l'altra classe, quindi non posso reindirizzarlo.
Vapcguy,

1
In alternativa, apri App.xaml.csin Visual Studio. Utilizzare la barra di navigazione> Elenco a discesa Metodo> seleziona Main(disattivato). Questo ti porta a App.g.i.cs.
P.Brian.Mackey,

136

Il metodo Main () viene creato automaticamente. Se vuoi fornire il tuo devi (testato in VS2013 e VS2017):

  • Fare clic con il tasto destro del mouse su App.xaml in Esplora soluzioni, selezionare Proprietà
  • Cambia 'Build Action' in 'Page' (il valore iniziale è 'ApplicationDefinition')

Quindi aggiungi un metodo Main () a App.xaml.cs. Potrebbe essere così:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}

2
[STAThread] imposta il modello di threading COM per l'applicazione. Di solito lo imposti su STA e non devi preoccuparti di cosa fa esattamente. Se sei interessato, controlla msdn.microsoft.com/de-de/library/…
Andreas Kahler

Non farlo! Ciò interromperà permanentemente StaticResources definito in App.xaml in Stili in Designer per l'intero progetto.
Himbeer

13

Main() viene fornito automaticamente dal CLR e dal WPF.

Il compilatore C # accetta un'opzione della riga di comando /mche specifica il tipo che contiene l'implementazione di Main(). Per convenzione, se non viene specificato esplicitamente alcun oggetto di avvio, CLR cercherà qualsiasi classe che abbia un Main()metodo statico e lo chiamerà. (Come ha sottolineato @Marc Gravel nel suo commento)

Nel caso di WPF, Main()viene generato automaticamente quando App.xamlviene creato e l' opzione / m viene specificata per fare in modo che il compilatore C # utilizzi quella classe come punto di ingresso. Tuttavia, se si guardano le proprietà del progetto, si trova un'impostazione per la scelta dell'oggetto di avvio. Quindi, se vuoi, puoi fornire la tua classe che implementa Main().

Tieni presente che ciò ti assumerà la responsabilità di creare l' Applicationistanza e di chiamarne il Run()metodo per garantire che l'infrastruttura WPF sia avviata correttamente.


In realtà, senza di /messa non importa come si chiama il tipo; se non sei esplicito, cerca solo di trovare unMain metodo adatto e si lamenta se trova 0 o più di uno. Ad esempio, l'esempio "Hello World" nelle specifiche della lingua (§1.1) utilizza Hellocome nome del tipo.
Marc Gravell

2
Essere pedanti: non è proprio esatto dire che main()è fornito dal CLR (il runtime), è proprio il compilatore che lo genera.
Hank

Aggiunto il mio +1 per ricordare al pubblico che dovranno aggiungere nella propria istanza dell'applicazione (es. MyApp.App app = new MyApp.App();) E chiamarlo .Run(), come Main()avrebbe fatto il precedente . Ottima scelta. Inoltre, dovrei aggiungere app.InitializeComponent();prima app.Run(), e fortunatamente per noi, il InitializeComponent()metodo originale è ancora lì (visto in App.g.cs, quindi non è necessario aggiungere quello indietro!).
vapcguy,

7

Main()viene generato durante la compilazione. Puoi trovarlo in App.g.cs(nella obj/{Debug,Release}cartella).


6

main()è un punto di ingresso standard per un'applicazione, ma tutte le applicazioni sono strutturate in questo modo. In un progetto XAML, il file App.XAML specifica il punto di ingresso in cui è indicato StartupUri="MainWindow.xaml".

Come affermato da altri, la funzione principale effettiva viene generata in base al contenuto dei file XAML nel progetto.


1

Ho copiato i file che non sarebbero stati caricati in un altro progetto che era senza una finestra principale in uno nuovo e ho riscontrato questo errore.

Per me ci è voluto fare l'approccio opposto ad Andreas Kahler per risolvere:

Dopo aver creato un file di finestra e aver impostato l'uri di avvio su questo file, ho passato Page a ApplicationDefinition della proprietà 'Build Action' di App.xaml.


0

Se hai rimosso App.xaml predefinito e MinWindow.xaml, meglio modificare .csproj Dopo aver aggiunto App.xaml manualmente, il tuo .csproj sarà:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

Cambia questo in:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.