2011-08-26 58 views
5

我想知道当我的程序以命令行参数开始(即传递文件名)时,是否可以'自动加载我的主窗口'关闭'。我遇到的问题是我的程序在与它关联的文件被点击时加载,但是通过打开另一个主窗口并使用它来加载。我遇到的问题是,程序之后仍会启动MainWindow,从而打开两个Windows,一个是文件内容,一个是空的。C# - 无窗口程序

如何防止空白窗口?正如我所看到的,我要么停止打开主窗口,关闭主窗口或让程序将文件传递到主窗口。我的问题是,我不知道哪些是最好的或者如何去做。

这是代码:

protected override void OnStartup(StartupEventArgs e) 
    { 
     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     { 

      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
      MainWindow mw = new MainWindow(); 
      mw.Show(); 
      mw.readVcard(fname); 
      Application.Current.Windows. 
     } 
    } 

编辑:

我的解决办法是在底部。

+0

阅读命令行参数的一部分,如果它是一些值,不显示主窗口不起作用? –

回答

5

我假设你使用WPF?您需要替换WPF为您提供的入口点(Main)。然后,您可以启动WPF或不依赖于命令行参数。看到这个问题的更多信息:

Replacing the WPF entry point

6

我相信你可以用自己的Main方法添加一个单独的类,并将其设置为可执行文件的入口点。然后你可以解析那里的方法参数,或者调出主窗口。

(我假设这是一个WPF应用程序 - 这是一个WinForms应用程序简单,因为你可以直接修改原有的主要方法。)

+0

谢谢。是的,这是WPF。我想我会遵循,会在早上检查并回来。 – user646265

+0

请参阅Qwertie关于如何替换WPF生成的'Main'方法的答案。 –

+1

@Merlyn:并不是所引用问题的接受答案是,尽管你可以这样做,但回答者仍建议创建一个单独的类,而不是:) –

1

我重写代码如下:

protected override void OnStartup(StartupEventArgs e) 
{ 
    // start application window 
    MainWindow mw = new MainWindow(); 
    mw.Show(); 
    // store argument and read card info 
    if (e.Args != null && e.Args.Count() > 0) 
    { 
     this.Properties["ArbitraryArgName"] = e.Args[0]; 
     string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
     mw.readVcard(fname); 
    } 
} 

这假定方法MainWindow.readVcard(string)只是将数据加载到当前实例中。

1

大家好,感谢回去我,对不起,我不回来越快。 Nate说的一部分是正确的,因为我需要先调用我的Window,然后如果有命令行参数,则解析文件名。我看到的问题是,它之后仍然启动了一个主窗口,因为它被设置为我的启动,所以我使用Qwertie建议的信息来更改我的app.xaml,这意味着它指向一个不同的启动,它这意味着该窗口没有被不必要地打开。

在“应用:应用程序类App.xaml.cs:

private void OnStartUp(object sender, StartupEventArgs e) 
    { 
     OnStartup(e); 
    } 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     MainWindow mw = new MainWindow(); 

     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     //base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     {    
      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 

      mw.Show(); 
      mw.readVcard(fname); 
      //Application curApp = Application.Current; 
      //curApp.Shutdown(); 
     } 

     else if (e.Args.Count() == 0) 
     { 
      mw.Show(); 
     } 
    } 

在App.xaml中:

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

    </Application.Resources> 
</Application> 
<!--StartupUri="MainWindow.xaml"--> 

再次感谢大家的答案。感谢大家。

0

我编辑app.xmal以删除起始URL。然后我编辑app.xaml.cs并为App添加构造函数并在那里处理我的处理 - 我使用“Shutdown()”关闭应用程序。

您可以根据需要打开窗户。当我启动其他窗口时,我使用OnStartup事件来完成它...