Remplacement du point d’entrée WPF

WPF définit sa propre méthode Main() . Comment dois-je procéder pour le remplacer par ma propre méthode Main qui (normalement) ouvre la MainWindow WPF (par exemple pour append un mode de script non-WPF via des arguments de ligne de commande)?

Certains exemples décrivent la modification de l’action Build d’App.xaml à partir d’ ApplicationDefinition en Page et l’écriture de votre propre Main() qui instancie la classe App et appelle sa méthode Run() , mais cela peut avoir des conséquences indésirables dans la résolution des ressources applicatives .xaml.

Au lieu de cela, je suggère de créer votre propre Main() dans sa propre classe et de définir l’object de démarrage sur cette classe dans les propriétés du projet:

 public class EntryPoint { [STAThread] public static void Main(ssortingng[] args) { if (args != null && args.Length > 0) { // ... } else { var app = new App(); app.InitializeComponent(); app.Run(); } } } 

Je le fais pour tirer parti de certains événements AppDomain auxquels vous devez vous abonner avant toute autre chose (comme AssemblyResolve ). Les conséquences indésirables de la définition de App.xaml sur Page que j’ai rencontrée incluaient mes vues UserControl (MV-VM) ne résolvant pas les ressources contenues dans App.xaml au moment du design.

En général, je App.xaml pour append ce support:

  

La partie pertinente étant que j’ai changé de StartupUri à Startup avec un gestionnaire d’événements dans App.xaml.cs Voici un exemple:

 ///  /// Interaction logic for App.xaml ///  public partial class App : Application { private void Application_Startup(object sender, StartupEventArgs e) { int verbose = 0; var optionSet = new OptionSet { { "v|verbose", "verbose output, repeat for more verbosity.", arg => verbose++ } }; var extra = optionSet.Parse(e.Args); var mainWindow = new MainWindow(verbose); mainWindow.Show(); } } 

guys Le problème est que votre programme a deux méthodes Main () statiques, ce qui provoquera une plainte entre le compilateur; Pour résoudre ce problème, essayez l’une des opérations suivantes:

  • Indiquez au compilateur que votre méthode statique Main () doit être le point d’entrée de l’exécution. Définissez le paramètre «Objet de démarrage» de votre projet sur la classe contenant votre méthode statique Main () cliquez avec le bouton droit sur le projet dans l’Explorateur de solutions, sélectionnez ”Puis recherchez le paramètre“ Objet de démarrage ”sous l’onglet“ Application ”).
  • Désactivez la génération automatique de la méthode Main () statique de App.g.cs: dans l’Explorateur de solutions, cliquez avec le bouton droit sur App.xaml, choisissez «Properties», puis modifiez «Build Action» de «ApplicationDefinition» à «Page».

Créez une nouvelle classe avec votre méthode principale statique personnalisée. A la fin de cette méthode, appelez simplement App.Main () généré par WPF:

 public class Program { [STAThread] public static void Main(ssortingng[] args) { // Your initialization code App.Main(); } } 

Ensuite, définissez le paramètre «Objet de démarrage» de votre projet sur la classe contenant votre main statique ().

En utilisant un fichier principal personnalisé (), vous pouvez rencontrer des problèmes car StartupUri n’est pas défini.

Vous pouvez l’utiliser pour le définir sans maux de tête dans votre classe App (n’oubliez pas de supprimer StartupUri de App.xaml et de définir son action de génération sur Page):

 [STAThread] static void Main() { App app = new App(); app.InitializeComponent(); app.Run(); } protected void OnStartup(object sender, StartupEventArgs e) { var toUri = new UriTypeConverter(); StartupUri = (Uri)toUri.ConvertFrom("MainWindow.xaml"); ... }