替换WPF入口点

问题描述

| WPF定义了自己的“ 0”方法。我应该如何用自己的
Main
方法替换它(通常)打开WPF
MainWindow
(例如,通过命令行参数添加非WPF脚本模式)?     

解决方法

        一些示例描绘了将App.xaml的Build Action从
ApplicationDefinition
更改为
Page
,并编写了实例化
App
类并调用其
Run()
方法的自己的
Main()
,但这可能会导致App中应用程序级资源的解析产生一些不良后果。 xaml。 相反,我建议在自己的类中创建自己的“ 0”,并在项目属性中将“启动对象”设置为该类:
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();
        }
    }
}
我这样做是为了利用某些
AppDomain
事件,这些事件必须先订阅才能发生(例如
AssemblyResolve
)。我遇到的将App.xaml设置为ѭ4的不良后果包括我的
UserControl
视图(M-V-VM)在设计期间没有解析App.xaml中的资源。     ,        通常,我编辑ѭ14来添加此支持:
<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\">
我的相关部分在
App.xaml.cs
中由事件处理程序从
StartupUri
更改为
Startup
。这是一个例子:
/// <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();
    }
}
    ,        伙计们 问题是您的程序有两个静态Main()方法,这将导致编译器在两者之​​间产生抱怨。要解决此问题,请尝试以下方法之一: 告诉编译器您的静态Main()方法应该是执行入口点-将项目的“启动对象”设置设置为包含您的静态Main()方法的类(在解决方案资源管理器中右键单击该项目,选择“属性, ”,然后在“应用程序”标签下查找“启动对象”设置。 关闭自动生成的App.g.cs的静态Main()方法-在解决方案资源管理器中,右键单击App.xaml,选择“属性”,然后将“构建操作”从“ ApplicationDefinition”更改为“ Page”。     ,        使用自定义的静态Main方法创建新类。在此方法的最后,只需调用WPF生成的原始App.Main()即可:
public class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        // Your initialization code
        App.Main();
    }
}
然后,将项目的“启动对象”设置设置为包含静态Main()的类。     ,        使用自定义Main()可能会遇到问题,因为未设置StartupUri。 您可以在App类中使用它进行设置(不要忘了从App.xaml中删除StartupUri并将其Build Action设置为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\");
...
}