Reemplazar el punto de entrada de WPF

WPF define su propio método Main() . ¿Cómo debo reemplazarlo con mi propio método Main que (normalmente) abre WPF MainWindow (por ejemplo, para agregar un modo de escritura que no sea de WPF a través de argumentos de línea de comandos)?

Algunos ejemplos ilustran la modificación de App.xaml’s Build Action de ApplicationDefinition a Page y la escritura de su propio Main() que ejemplifica la clase de la App y llama a su método Run() , pero esto puede producir consecuencias no deseadas en la resolución de recursos de la aplicación. .xaml.

En su lugar, sugiero crear su propio Main() en su propia clase y establecer el objeto de inicio para esa clase en las propiedades del proyecto:

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

Lo hago para aprovechar algunos de los eventos de AppDomain que deben suscribirse antes de que ocurra algo más (como AssemblyResolve ). Las consecuencias no deseadas de configurar App.xaml en la Page que experimenté incluyeron mis vistas de UserControl (MV-VM) que no resolvieron los recursos almacenados en App.xaml durante el tiempo de diseño.

Normalmente edito App.xaml para agregar este soporte:

  

La parte relevante es que cambié de StartupUri a Startup con un controlador de eventos en App.xaml.cs Aquí hay un ejemplo:

 ///  /// 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(); } } 

chicos El problema es que su progtwig tiene dos métodos Main () estáticos, que harán que el comstackdor se queje entre ellos; Para resolver esto, pruebe uno de los siguientes:

  • Indique al comstackdor que su método Main () estático debe ser el punto de entrada de la ejecución: establezca la configuración de “objeto de inicio” de su proyecto en la clase que contiene su método Main () estático (haga clic derecho en el proyecto en el Explorador de soluciones, elija “Propiedades, “Luego busque la opción” Objeto de inicio “en la pestaña” Aplicación “).
  • Desactive la generación automática del método Main () estático de App.g.cs: en el Explorador de soluciones, haga clic con el botón derecho en App.xaml, elija “Propiedades” y luego cambie “Acción de comstackción” de “Definición de aplicación” a “Página”.

Crea una nueva clase con tu método Principal estático personalizado. Al final de este método, simplemente llame a App.Main () original generado por WPF:

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

A continuación, establezca la configuración “Objeto de inicio” de su proyecto en la clase que contiene Main () estática.

Si utiliza un Main () personalizado, es posible que tenga problemas porque StartupUri no está configurado.

Puede usar esto para configurarlo sin dolores de cabeza en su clase de aplicación (no olvide eliminar StartupUri de App.xaml y configure su acción de comstackción en la página):

 [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"); ... }