c# - 打开文件的WPF命令行参数给出了无限循环

时间:2011-03-05 18:45:23

标签: c# command-line-arguments infinite-loop vcard

这是一个奇怪的!我正在开发一个应用程序来读取vCard文件,其中包含一个人的联系人等信息。每个文件可能包含单独的“部分”,每个部分包含一个人的详细信息,由BEGIN分隔:VCARD [data here] END:VCARD。

为了让我的用户能够查看所有不同的详细信息,我允许我的程序使用详细信息填充我的应用程序中的文本框,然后打开一个新窗口并使用该窗口执行此操作,但是对于每个不同的文件中的部分。

当在Explorer中双击vCard文件时我的程序打开时出现问题。它不断循环通过vCard。我不知道该怎么做,但下面是我有问题的代码:

    public void readVcard(string fname)//Reads vCard and then loops through sections
    {
        try
        {
            using (StreamReader r = new StreamReader(fname))
            {
                string input = File.ReadAllText(fname);//read through file

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

                int i;

                for (i = 1; i < vArray.Length; i++)
                {
                    MainWindow a = new MainWindow();
                    a.parser(vArray[i]); //Parser is the function that populates the app
                    a.Show();
                }

                return;
            }
        }...

此功能从此处调用:

    void MainWindow_Loaded(object sender, RoutedEventArgs e)//Processes a file when opened externally
    {
        if (Application.Current.Properties["ArbitraryArgName"] != null)
        {
            string fname = Application.Current.Properties["ArbitraryArgName"].ToString();

            readVcard(fname);

        }
    }

如果有人可以提供帮助,我们将不胜感激。

3 个答案:

答案 0 :(得分:3)

我认为Artyom走在正确的轨道上。

每当你创建另一个 MainWindow 并加载它时,你将获得当前的应用程序argurment并跳回 readVcard ,这将处理你所使用的相同的vCard已经处理并打开了另一个 MainWindow ,它将继续这个过程。

考虑将 MainWindow_Loaded()中的所有代码移至应用程序的启动事件。这样,它只会在程序第一次加载时调用一次,而不是每次都创建一个新窗口。

要执行此操作,您需要在App.xaml文件中注册该事件,如下所示:

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

然后在App.xaml背后的代码中,您将代码用于阅读vCard。像这样:

namespace MyProgram
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            if (Application.Current.Properties["ArbitraryArgName"] != null)
            {
                string fname = Application.Current.Properties["ArbitraryArgName"].ToString();

                readVcard(fname);

            }
        }
    }
}

答案 1 :(得分:1)

当您创建并显示新的MainWindow(a.Show())时,MainWindow_Loaded事件再次触发,并再次调用readVcard方法。所以存在无限循环。

或者可能不是真的无限,因为,我相信,一段时间之后可能会发生StackOverflowException。

您只需要查看启动逻辑,因此readVcard不会在MainWindow_Loaded事件中启动,例如,在Main方法中(在program.cs文件中)。或者你可以添加一些标志,当readVcard方法首次调用时,它将被设置。

答案 2 :(得分:0)

我懂了!我现在在App.xaml.cs中得到以下代码:

public partial class App : Application
{
    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);

        }
    }

}

工作正常!感谢大家。 BTW以下博客包含我最初使用的命令行信息,如果有人需要它:http://blogs.msdn.com/b/avip/archive/2008/10/27/wpf-supporting-command-line-arguments-and-file-extensions.aspx