c # - WPF открывает файл извне, не завершая процесс при закрытии и не анализируя данные

Недавно я работал над синтаксическим анализатором vCard, который открывает файл vCard и заполняет ряд текстовых полей данными из файлов. Когда мое приложение связано с vCard, vCard открывает программу, и имя файла передается через функцию statup в функцию, называемую readVcard. Затем он разбивается каждым оператором BEGIN:VCARD на массив с именем string. Если длина больше 1, в окне отображается диалоговое окно с данными из индекса в массиве, и когда этот диалог закрывается, открывается новый, пока содержимое не будет прочитано. Когда последнее окно закрывается, программа не завершается, если файл открывается извне, но если он открывается внутри, он работает нормально!

У меня также есть проблема с анализом данных из readVcard. Я проверил это, и данные используются в функции readVcard, но не передаются в функцию синтаксического анализатора, где она фактически анализирует их. Опять же, это отлично работает, когда файл открыт внутри, но не снаружи.

Это мое стартовое событие:

    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.readVcard(fname);
            //Application curApp = Application.Current;
            //curApp.Shutdown();
        }

    }

Функция чтения vCard приведена ниже:

                    string input = File.ReadAllText(fname);//read through file

                progressBar1.Value = 10;

                input = input ?? "---This file did not contain any text---jlb95";

                if (input != "---This file did not contain any text---jlb95" || input != "")
                {

                    if (!input.Contains("BEGIN:VCARD") || !input.Contains("END:VCARD"))
                    {
                        MessageBox.Show("This file: " + fname + " is not formatted correctly." + "\r\n Error: 001", "File not formatted correctly", MessageBoxButton.OK, MessageBoxImage.Error);
                        progressBar1.Value = 0;
                    }

                    else
                    {
                        String[] vArray = input.Split(new string[] { "BEGIN:VCARD" }, StringSplitOptions.RemoveEmptyEntries);

                        if (vArray.Length > 1)
                        {
                            MessageBoxResult dialog = MessageBox.Show("This vCard File contains multiple contacts. The program can loop through them and will open a new Window for each one" +
                                " when the current window is closed or it can open the first contact. Do you want to open all the contacts?", "File contains multiple contacts", MessageBoxButton.YesNo, MessageBoxImage.Question
                                , MessageBoxResult.Yes);

                            if (dialog == MessageBoxResult.Yes)
                            {
                                progressBar1.Value = 20;

                                foreach (var v in vArray)
                                {
                                    MessageBox.Show(v);
                                    MainWindow mainWindow = new MainWindow();
                                    mainWindow.parser(v, fname);
                                    mainWindow.ShowDialog();

                                }

                                progressBar1.Value = 0;

                                return;
                            }

person user646265    schedule 12.03.2011    source источник


Ответы (1)


Не волнуйтесь: исправлено. На самом деле метод не вызывал mw для отображения, поэтому данные не обрабатывались и оставались зависшими, когда текущее окно было закрыто.

        if (Application.Current.Properties["ArbitraryArgName"] != null)
        {
            string fname = Application.Current.Properties["ArbitraryArgName"].ToString();
            MainWindow mw = new MainWindow();
            mw.Show();
            mw.readVcard(fname);
        }
person user646265    schedule 13.03.2011