Pas de Main () dans WPF?

128

Je suis un débutant en matière de programmation mais j'étais sûr qu'une des règles universelles était qu'un programme commence par Main (). Je n'en vois pas lorsque je crée un projet WPF. Main () est-il simplement nommé quelque chose différemment dans WPF?

Jus
la source
13
Vous pouvez obtenir la fonctionnalité équivalente en remplaçant OnStartup dans App.xaml.cs. StartupEventArgs.Args contient les arguments de ligne de commande.
Foole
1
@Foole, non, vous ne pouvez pas, voir cette question.
Sinatr

Réponses:

73

Il est généré lors de la construction, mais vous pouvez fournir le vôtre (en éliminant l'ambiguïté dans les propriétés du projet si nécessaire). Recherchez dans obj / debug un fichier d'application; J'ai (avec la permission de "C # 2010 Express") App.g.i.csavec:

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();
        }
    }
}
Marc Gravell
la source
1
La même chose existe App.g.cségalement. Mais j'ai essayé d'ajouter Main()et à chaque fois que je reconstruisais mon projet, il revenait à ce que vous avez, ici. J'ai essayé de créer le mien dans une autre classe, mais Project Properties ne trouve que MyProject.App, pas l'autre classe, donc je ne peux pas le rediriger.
vapcguy
1
Sinon, ouvrez App.xaml.csle studio visuel. Utilisez la barre de navigation> Liste déroulante Méthode> sélectionnez Main(grisée). Cela vous amène à App.g.i.cs.
P.Brian.Mackey
136

La méthode Main () est créée automatiquement. Si vous souhaitez fournir le vôtre, vous devez (testé dans VS2013 et VS2017):

  • Cliquez avec le bouton droit sur App.xaml dans l'explorateur de solutions, sélectionnez Propriétés
  • Remplacez 'Build Action' par 'Page' (la valeur initiale est 'ApplicationDefinition')

Ensuite, ajoutez simplement une méthode Main () à App.xaml.cs. Ça pourrait être comme ça:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}
Andreas Kahler
la source
2
[STAThread] définit le modèle de thread COM pour votre application. Habituellement, vous le réglez simplement sur STA et vous n'avez pas à vous soucier de ce qu'il fait exactement. Si vous êtes intéressé, consultez msdn.microsoft.com/de-de/library/…
Andreas Kahler
Ne fais pas ça! Cela interrompra définitivement StaticResources défini dans App.xaml dans Styles dans le Designer pour l'ensemble du projet.
Himbeer
13

Main() est automatiquement fourni par le CLR et le WPF.

Le compilateur C # prend un commutateur de ligne de commande /mqui spécifie le type qui contient l'implémentation de Main(). Par convention, si aucun objet de démarrage n'est explicitement spécifié, le CLR recherchera toute classe qui a une Main()méthode statique et l'appellera. (Comme @Marc Gravel l'a souligné dans son commentaire)

Dans le cas de WPF, le Main()est automatiquement généré lors de la génération App.xamlet le commutateur / m est spécifié pour que le compilateur C # utilise cette classe comme point d'entrée. Cependant, si vous regardez les propriétés du projet, vous constaterez qu'il existe un paramètre vous permettant de choisir l'objet de démarrage. Donc, si vous le souhaitez, vous pouvez fournir votre propre classe qui implémente Main().

Notez que cela vous incombera de créer l' Applicationinstance et d'appeler sa Run()méthode pour vous assurer que l'infrastructure WPF est démarrée correctement.

Franci Penov
la source
En fait, sans /mcela, peu importe comment le type est appelé; si vous n'êtes pas explicite, il essaie simplement de trouver uneMain méthode appropriée et se plaint s'il en trouve 0 ou plus d'une. À titre d'exemple, l'exemple "Hello World" dans la spécification de langue (§1.1) utilise Hellocomme nom de type.
Marc Gravell
2
Pour être pédant: ce n'est pas vraiment exact de dire que main()c'est fourni par le CLR (le runtime), c'est vraiment le compilateur qui le génère.
Hank
Ajout de mon +1 pour rappeler au public qu'ils devront ajouter leur propre instance d'application (c'est-à-dire MyApp.App app = new MyApp.App();) et l'appeler .Run(), comme l' Main()aurait fait la précédente . Bon appel. De plus, il faudrait ajouter app.InitializeComponent();avant app.Run(), et heureusement pour nous, la InitializeComponent()méthode originale est toujours là (vue dans App.g.cs, donc pas besoin de rajouter celle-là!).
vapcguy
7

Main()est généré lors de la compilation. Vous pouvez le trouver dans App.g.cs(dans le obj/{Debug,Release}dossier).

Vlad
la source
6

main()est un point d'entrée standard pour une application, mais toutes les applications sont structurées de cette façon. Dans un projet XAML, le fichier App.XAML spécifie le point d'entrée où il est indiquéStartupUri="MainWindow.xaml" .

Comme indiqué par d'autres, la fonction principale réelle est générée en fonction du contenu des fichiers XAML du projet.

Annath
la source
1

J'ai copié des fichiers qui ne se chargeraient pas dans un autre projet sans fenêtre principale dans un nouveau et j'ai obtenu cette erreur.

Pour moi, il a fallu adopter l'approche inverse d'Andreas Kahler pour corriger:

Après avoir créé un fichier de fenêtre et défini l'URI de démarrage sur ce fichier, j'ai basculé la page sur ApplicationDefinition de la propriété App.xaml 'Build Action'.

Declan Taylor
la source
0

Si vous avez supprimé App.xaml par défaut et MinWindow.xaml, mieux vaut éditer .csproj Après avoir ajouté App.xaml manuellement, votre .csproj sera:

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

Remplacez ceci par:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
utilisateur10372515
la source