Командной строки в WPF
Я пытаюсь создать приложение WPF, которое принимает аргументы командной строки. Если аргументы не приведены,должно появиться главное окно. В случае некоторых конкретных аргументов командной строки код должен выполняться без GUI и выходить по завершении. Любые предложения о том, как это должно быть сделано должным образом будут оценены.
4 ответов
во-первых, найти этот атрибут в верхней части вашего приложения.xaml-файл и удалите его:
StartupUri="Window1.xaml"
это означает, что приложение не будет автоматически создать главное окно и показать его.
затем переопределите метод OnStartup в классе приложения для выполнения логики:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if ( /* test command-line params */ )
{
/* do stuff without a GUI */
}
else
{
new Window1().ShowDialog();
}
this.Shutdown();
}
чтобы проверить наличие вашего аргумента-в решении Мэтта используйте это для своего теста:
Эл.Аргументы.Содержит("MyTriggerArg")
комбинация вышеуказанных решений для .NET 4.0+ с выходом на консоль:
[DllImport("Kernel32.dll")]
public static extern bool AttachConsole(int processID);
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if (e.Args.Contains("--GUI"))
{
// Launch GUI and pass arguments in case you want to use them.
new MainWindow(e).ShowDialog();
}
else
{
//Do command line stuff
if (e.Args.Length > 0)
{
string parameter = e.Args[0].ToString();
WriteToConsole(parameter);
}
}
Shutdown();
}
public void WriteToConsole(string message)
{
AttachConsole(-1);
Console.WriteLine(message);
}
измените конструктор в главном окне, чтобы принять аргументы:
public partial class MainWindow : Window
{
public MainWindow(StartupEventArgs e)
{
InitializeComponent();
}
}
и не забудьте удалить:
StartupUri="MainWindow.xaml"
Вы можете использовать следующие в :
private void Application_Startup(object sender, StartupEventArgs e)
{
MainWindow WindowToDisplay = new MainWindow();
if (e.Args.Length == 0)
{
WindowToDisplay.Show();
}
else
{
string FirstArgument = e.Args[0].ToString();
string SecondArgument = e.Args[1].ToString();
//your logic here
}
}