.net - ejemplos - xaml pdf español
Reemplazar el punto de entrada de WPF (5)
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.
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.
Normalmente edito App.xaml
para agregar 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 relevante es que cambié de StartupUri
a Startup
con un controlador de eventos en App.xaml.cs
Aquí hay 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();
}
}
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 compilació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");
...
}
chicos El problema es que su programa tiene dos métodos Main () estáticos, que harán que el compilador se queje entre ellos; Para resolver esto, pruebe uno de los siguientes:
- Indique al compilador 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 compilación" de "Definición de aplicación" a "Página".