C # - программа без окна - PullRequest
       10

C # - программа без окна

5 голосов
/ 27 августа 2011

Мне интересно, можно ли «отключить» мое главное окно от автоматической загрузки, когда моя программа запускается с аргументом командной строки (то есть, когда передается имя файла).У меня проблема в том, что моя программа загружается при нажатии на файл, связанный с ним, но делает это, открывая другое главное окно и используя его.У меня проблема в том, что программа все еще запускает MainWindow, открывая две Windows, одну с содержимым файла, а другую пустую.

Как предотвратить пустое окно?Как я вижу, я либо прекращаю открывать главное окно, либо закрываю главное окно, либо заставляю программу передавать файл в главное окно.Моя проблема в том, что я не знаю, какой из них будет лучшим или как это сделать.

Это код:

    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.
        }
    }

РЕДАКТИРОВАТЬ:

Мое решение внизу.

Ответы [ 5 ]

6 голосов
/ 27 августа 2011

Я полагаю, что вы можете добавить отдельный класс с собственным методом Main и установить его как точку входа вашего исполняемого файла.Затем вы можете проанализировать аргументы метода там и либо вызвать главное окно, либо нет.

(я предполагаю, что это приложение WPF - проще в приложении WinForms, так как вы можете изменить исходный метод Main напрямую.)

5 голосов
/ 27 августа 2011

Я полагаю, вы используете WPF?Вы захотите заменить точку входа (Main), которую WPF предоставляет для вас.Затем вы можете запустить WPF или нет в зависимости от аргументов командной строки.См. Этот вопрос для получения дополнительной информации:

Замена точки входа WPF

1 голос
/ 28 августа 2011

Привет всем и спасибо, что вернулись ко мне, извините, я не вернусь раньше.Часть того, что сказал Нейт, была правильной в том, что мне нужно было вызвать мой Window раньше, а затем, если был аргумент командной строки, проанализировать имя файла.Проблема, как я увидел, заключалась в том, что он все еще запускал главное окно, потому что оно было установлено в качестве моего запуска, поэтому я использовал информацию, предложенную Qwertie, для изменения моего app.xaml, что означало, что оно указывало на другой запуск, которыйв свою очередь, это означало, что окно не было открыто без необходимости.

В классе «App: Application» в 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"-->

Еще раз спасибо всем за ответы.С уважением всех вас.

1 голос
/ 27 августа 2011

Я бы переписал ваш код следующим образом:

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) просто загружает данные в текущий экземпляр.

0 голосов
/ 17 октября 2017

Я редактирую app.xmal, чтобы удалить начальный URL. Затем я редактирую app.xaml.cs и добавляю конструктор для App и выполняю там свою обработку - я использую «Shutdown ()» для закрытия приложения.

Вы можете открывать окна по мере необходимости. Когда я запускаю другие окна, я использую событие OnStartup, чтобы сделать это ...

...