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 WPF mediante argumentos de línea de comandos)?Reemplazar el punto de entrada WPF
Respuesta
Algunos ejemplos ilustran el cambio de Acción de generación de App.xaml de ApplicationDefinition
a Page
y escribir su propio Main()
que instancia la clase App
y llama a su método Run()
, pero esto puede producir algunas consecuencias no deseadas en el resolución de recursos de toda la aplicación en App.xaml.
En cambio, sugiero hacer su propio Main()
en su propia clase y establecer el objeto inicial de 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 algunas AppDomain
eventos que deben estar suscrito antes de que pase cualquier otra cosa (como AssemblyResolve
). Las consecuencias no deseadas de configurar App.xaml en Page
que experimenté incluyen mis UserControl
Vistas (M-V-VM) que no resuelven los recursos almacenados en App.xaml durante el tiempo de diseño.
Normalmente edito App.xaml
añadir este soporte:
<Application x:Class="SomeNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup">
La parte pertinente de ser pasé de StartupUri
a Startup
con un controlador de eventos en App.xaml.cs
. He aquí un ejemplo:
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
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();
}
}
Aunque con este enfoque, a menos lo ejecuta desde una ventana de comandos, no verá ningún resultado 'Console '. *. – user7116
Este enfoque me permite pasar argumentos de constructor a la ventana principal, lo cual es bueno. Incluso podría combinarlo con el enfoque de Joel. – Qwertie
¡Gracias por señalar que es "Inicio" y no "StartupUri"! –
Crea una nueva clase con tu método principal estático personalizado. Al final de este método sólo llamar App.Main originales() generado por WPF:
public class Program
{
[STAThread]
public static void Main(string[] args)
{
// Your initialization code
App.Main();
}
}
Después ajuste “Objeto inicial” de su proyecto de establecer a la clase que contiene su estática Principal().
guys El problema es que su programa tiene dos métodos Main() estáticos, que causarán que el compilador se queje entre; Para resolver este problema, pruebe uno de los siguientes:
- indicar al compilador que el método de su estática Principal() debe ser “objeto inicial” de la entrada ejecución en el punto Conjunto de tu proyecto de establecer a la clase que contiene su estática Principal() método (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").
- Desactivar 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 secundario en App.xaml, elija "Propiedades" y luego cambie "Acción de compilación" de "Definición de aplicación" a "Página ".
Gracias; El segundo punto era crucial, sutilmente guardado allí. – Jeb
Al utilizar un Main() personalizado, es posible que tenga problemas porque StartupUri no está configurado.
Usted puede usar esto para configurarlo y sin dolores de cabeza en su clase de aplicación (No se olvide de quitar StartupUri de App.xaml y establecer su Acción de generación de 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");
...
}
- 1. WPF ControlTemplate parcial reemplazar
- 2. Mostrar progreso punto-punto-punto en un botón WPF
- 3. Reemplazar punto (.) Con coma (,) usando RegEx?
- 4. bash.exe - punto de entrada no encontrado
- 5. Reemplazar el estilo predeterminado en WPF TextBox, basado en PresentationFramework.Aero
- 6. No se encuentra el punto de entrada Excepción
- 7. ¿Cómo uso el punto de entrada wmain() en Code :: Blocks?
- 8. Evitar el principal (punto de entrada) en un programa C
- 9. ¿Dónde está el punto de entrada para una aplicación Rails?
- 10. Cómo obtener El punto medio de un ArcSegment en WPF
- 11. Tipo de entrada WPF/cuadro de diálogo?
- 12. WPF FrameworkElement no recibe entrada de mouse
- 13. WPF DataGridTextColumn entrada de varias líneas
- 14. ¿Cómo reemplazar parte de un valor de entrada en jquery?
- 15. Desarrollo de controlador de dispositivo Android - Punto de entrada
- 16. Reinicio de la aplicación - Actividad Punto de entrada
- 17. Acerca del punto de entrada de PE en Windows
- 18. Cómo reemplazar punto en una cadena en Java
- 19. contraseña de entrada campo-> reemplazar viñetas con imágenes
- 20. ¿Puede un ensamblado C# .dll contener un punto de entrada?
- 21. easy_install: ImportError: Punto de entrada ('console_scripts', 'easy_install') no encontrado
- 22. Forma correcta de reemplazar valores de estilo en WPF
- 23. El módulo ".dll" se cargó pero no se encontró el punto de entrada
- 24. Reemplazar coma con punto al obtener el valor flotante de NSString
- 25. Emacs: Insertar palabra en el punto en reemplazar consulta de cadena
- 26. WPF: cambiar el tamaño de un círculo, manteniendo el punto central en lugar de TopLeft?
- 27. Detener el cursor de saltar al final del campo de entrada en javascript reemplazar
- 28. Error de punto de entrada al ejecutar el script PHP desde la línea de comando
- 29. Inyección de entrada de mouse en aplicaciones WPF
- 30. Regex Reemplazar en el medio
De acuerdo, llamo a App.Main() en lugar de Run() porque Main() llama a InitializeComponent(), que instala el controlador de eventos de inicio. Supongo que debes llamar a Run() si cambias Build Action por Page (ya que Main() desaparece), pero lo dejé como ApplicationDefinition. – Qwertie
El 'Main()' generado genera una 'App' y llama a 'Run()'. El evento 'Startup' se activa en el constructor' System.Windows.Application'. 'Run()' conecta un 'Dispatcher' y comienza la bomba de mensajes. 'InitializeComponent()' debería llamarse en el constructor 'Apps'. ¿No lo es? –
No, el código generado por microsoft para la aplicación no incluye un constructor, por lo que debe llamarse a App.Main() para llamar tanto a InitializeComponent() como a Run(). Estoy usando VS2008/.NET3.5, si eso hace la diferencia. Tenga en cuenta que System.Windows.Application en sí no puede llamar a InitializeComponent, porque InitializeComponent solo existe en la clase derivada y no es virtual. Tampoco activará el evento de inicio porque no es posible que alguien se haya suscrito a ese evento hasta después de que el constructor regrese. – Qwertie