问题描述
|
WPF定义了自己的“ 0”方法。我应该如何用自己的
Main
方法替换它(通常)打开WPFMainWindow
(例如,通过命令行参数添加非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\");
...
}