web-dev-qa-db-fra.com

Non Main () dans WPF?

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

106
Juice

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

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();
        }
    }
}
69
Marc Gravell

La méthode Main () est créée automatiquement . Si vous voulez 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 'Action de génération' par 'Page' (la valeur initiale est 'ApplicationDefinition')

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

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

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

Le compilateur C # utilise un commutateur de ligne de commande /m qui 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 possédant une méthode statique Main() et l'appellera. (Comme @Marc Gravel l'a souligné dans son commentaire)

Dans le cas de WPF, la Main() est automatiquement générée lorsque App.xaml est créée et le commutateur/m est spécifié pour que le compilateur C # utilise cette classe comme point d'entrée. Si vous examinez 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 incitera à créer l'instance Application et à appeler sa méthode Run() pour vous assurer que l'infrastructure WPF est démarrée correctement.

13
Franci Penov

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

6
Vlad

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.

5
Annath

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

Pour moi, il a fallu faire l’approche opposée à Andreas Kahler pour réparer:

Après avoir créé un fichier window et défini l'URI de démarrage sur ce fichier, je suis passé de Page à ApplicationDefinition de la propriété App.xaml 'Build Action'.

0
Declan Taylor

Si vous avez supprimé App.xaml et MinWindow.xaml par défaut, il est préférable de modifier .csproj Après avoir ajouté App.xaml manuellement, votre .csproj sera:

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

Changer ceci pour:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
0
user10372515