WPF 定义了自己的Main()
方法。我应该如何用我自己的Main
方法(通常)打开 WPF MainWindow
(例如,通过命令行参数添加非 WPF 脚本模式)替换它?
5 回答
一些示例描述了将 App.xaml 的 Build Action 从更改为ApplicationDefinition
toPage
并编写您自己的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 中保存的资源。
通常我会编辑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() 方法应该是执行入口点——将你的项目的“启动对象”设置为包含你的静态 Main() 方法的类(在解决方案资源管理器中右键单击项目,选择“属性, ”然后在“应用程序”选项卡下查找“启动对象”设置)。
- 关闭自动生成 App.g.cs 的静态 Main() 方法——在解决方案资源管理器中,右键单击 App.xaml,选择“属性”,然后将“构建操作”从“应用程序定义”更改为“页面”。
使用您的自定义静态 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");
...
}