2

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

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

当在资源管理器中双击 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);

        }
    }

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

4

3 回答 3

3

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

每次您创建另一个MainWindow并加载它时,您将获得当前应用程序参数并跳回到readVcard,它将处理您已经在处理的同一个 vCard 并打开另一个MainWindow将继续该过程。

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

为此,您需要在 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);

            }
        }
    }
}
于 2011-03-05T20:18:48.947 回答
1

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

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

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

于 2011-03-05T19:19:37.770 回答
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);

        }
    }

}

它工作正常!感谢大家。顺便说一句,如果有人需要,以下博客包含我最初使用的命令行信息:http: //blogs.msdn.com/b/avip/archive/2008/10/27/wpf-supporting-command-line-arguments-和文件扩展名.aspx

于 2011-03-06T11:43:32.493 回答