c# -没有窗口的程序

本文关键字:程序 窗口 | 更新日期: 2023-09-27 18:06:41

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

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

这是代码:

    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.
        }
    }
编辑:

我的解决方案在底部

c# -没有窗口的程序

我相信您可以添加一个带有自己的Main方法的单独类,并将其设置为可执行文件的入口点。然后你可以在那里解析方法参数,并选择是否打开主窗口。

(我假设这是一个WPF应用程序-在WinForms应用程序中更简单,因为你可以直接修改原始的Main方法)

我假设您使用WPF?您需要替换WPF为您提供的入口点(Main)。然后,您可以根据命令行参数启动或不启动WPF。有关更多信息,请参阅此问题:

替换WPF入口点

从APP.XAML页面删除WindowUri。这不会显示任何窗口。此外,在app()构造函数或启动事件中添加逻辑。

我将重写您的代码如下:

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)只是将数据加载到当前实例中。

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

在App.xaml.cs中的' App: Application '类中:

    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"-->

再次感谢大家的回答。向大家问好。

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

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