replaceWPF入口点

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

一些示例描述了将App.xaml的构build操作从ApplicationDefinition更改为Page并编写自己的Main()来实例化App类并调用其Run()方法,但这会在解决App中的应用程序范围资源时产生一些不良后果的.xaml。

相反,我build议在自己的类中创build自己的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),而不是在devise时parsingApp.xaml中保存的资源。

通常我编辑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更改为StartupApp.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(); } } 

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

  • 告诉编译器,您的静态Main()方法应该是执行入口点 – 将您的项目的“Startup对象”设置设置为包含静态Main()方法的类(右键单击解决scheme资源pipe理器中的项目,select“Properties” “然后在”应用程序“(Application)选项卡下查找”启动对象“(Startup object)设置)。
  • closuresApp.g.cs静态Main()方法的自动生成 – 在解决scheme资源pipe理器中,右键单击App.xaml,select“Properties”,然后将“Build Action”从“ApplicationDefinition”更改为“Page”。

使用您的自定义静态Main方法创build新类。 在这个方法的最后,调用由WPF生成的原始App.Main():

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

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

使用自定义Main()可能会遇到问题,因为StartupUri未设置。

你可以使用它来设置它,而不会在你的应用程序类头痛(不要忘记从App.xaml中删除StartupUri并将其生成操作设置为页):

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