-
WPF应用程式:

WPF 中的命令行参数

命令行参数是一种技术,你可以给一个你想要启动的应用程序传一组参数,以某种方式去影响它。最常见的例子就是让应用程序去打开一个指定的文件,例如,在一个编辑器里打开。你可以用windows内置的Notepad应用程序尝试一下,通过运行(从【开始菜单】中选择 【运行】或按下[Windows键 + R]):

notepad.exe c:\Windows\win.ini

这个会打开Notepad去打开win.ini文件(你可能需要调整一下路径,以对应到你的系统)。Notepad简单的地查找一个或几个参数,然后使用这些参数,你的应用程序也可以这么做。

命令行的参数通过Startup事件(它是我们在App.xaml文章中订阅过的事件)传给你的WPF应用程序,我们会在这个例子中做同样的事情,然后使用这些通过方法参数传进来的值。首先,是App.xaml文件:

<Application x:Class="WpfTutorialSamples.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
			 Startup="Application_Startup">
    <Application.Resources></Application.Resources>
</Application>

我们所做的就是去订阅Startup事件,替换StartupUri属性。然后在App.xaml.cs中实现这个事件。

using System;
using System.Collections.Generic;
using System.Windows;

namespace WpfTutorialSamples
{
	public partial class App : Application
	{

		private void Application_Startup(object sender, StartupEventArgs e)
		{
			MainWindow wnd = new MainWindow();
			if(e.Args.Length == 1)
				MessageBox.Show("Now opening file: \n\n" + e.Args[0]);
			wnd.Show();
		}
	}
}

StartupEventArgs是我们这里使用的。它和它的名称e被传给了Application Startup事件。它有Args属性,这个属性是一组字符串。除了引号当中的空格,命令行的参数是以空格来分割的。

测试命令行参数

如果你运行上面的例子,不会发生任何变化,因为没有指定任何的命令参数。幸运的是,Visual Studio使得它在你的应用程序中易于测试。从项目菜单选择"[程序名称] 属性"然后进入到Debug页签(你可以在这里定义命令行参数)。这个应该能够看到像这样的内容:

尝试运行一下这个程序,你会看到它对你的参数作出了响应。

当然,消息不是很有帮助。取而代之的是,你可能想把它传给主窗口的构造函数,或者使用它去调用一个公共的open方法,像这样:

using System;
using System.Collections.Generic;
using System.Windows;

namespace WpfTutorialSamples
{
	public partial class App : Application
	{

		private void Application_Startup(object sender, StartupEventArgs e)
		{
			MainWindow wnd = new MainWindow();
			// The OpenFile() method is just an example of what you could do with the
			// parameter. The method should be declared on your MainWindow class, where
			// you could use a range of methods to process the passed file path
			if(e.Args.Length == 1)
				wnd.OpenFile(e.Args[0]);
			wnd.Show();
		}
	}
}

命令行的潜在价值

在这个例子中,我们测试是否只有一个参数,如果是的话,我们把它作为一个文件名使用。举一个真实世界的一个例子,你可能收集了一些参数,并且甚至把它们作为选项来进行使用,比如,切换某一个功能开或关。当收集需要去推进程序往前走的信息时,你可能会通过循环整个传进来的参数列表,但是这超出了本章的讨论范围。