c # - WPF открывает файл извне, не завершая процесс при закрытии и не анализируя данные - PullRequest
0 голосов
/ 12 марта 2011

Недавно я работал над анализатором 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;
                            }

1 Ответ

0 голосов
/ 13 марта 2011

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

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