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
更改为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(); } }
大家问题是你的程序有两个静态的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"); ... }