63

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

4

5 回答 5

65

一些示例描述了将 App.xaml 的 Build Action 从更改为ApplicationDefinitiontoPage并编写您自己的Main()来实例化App类并调用其Run()方法,但这可能会在 App.xaml 中的应用程序范围资源的解析中产生一些不良后果。

相反,我建议Main()在自己的类中创建自己的类,并在项目属性中将 Startup Object 设置为该类:

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 设置为我所经历的不良后果Page包括我的UserControl视图 (MV-VM) 在设计时无法解析 App.xaml 中保存的资源。

于 2011-05-27T19:10:20.423 回答
22

通常我会编辑App.xaml以添加此支持:

<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">

StartupUri相关部分是我Startup使用App.xaml.cs. 这是一个例子:

/// <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();
    }
}
于 2011-05-27T19:03:01.793 回答
18

伙计们 问题是你的程序有两个静态 Main() 方法,这会导致编译器抱怨;要解决此问题,请尝试以下方法之一:

  • 告诉编译器你的静态 Main() 方法应该是执行入口点——将你的项目的“启动对象”设置为包含你的静态 Main() 方法的类(在解决方案资源管理器中右键单击项目,选择“属性, ”然后在“应用程序”选项卡下查找“启动对象”设置)。
  • 关闭自动生成 App.g.cs 的静态 Main() 方法——在解决方案资源管理器中,右键单击 App.xaml,选择“属性”,然后将“构建操作”从“应用程序定义”更改为“页面”。
于 2014-04-29T10:17:52.250 回答
4

使用您的自定义静态 Main 方法创建新类。在此方法结束时只需调用 WPF 生成的原始 App.Main():

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

然后将项目的“启动对象”设置为包含静态 Main() 的类。

于 2013-02-15T21:41:37.370 回答
0

使用自定义 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");
...
}
于 2015-08-05T14:33:12.367 回答