这是一个奇怪的!我正在开发一个应用程序来读取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);
}
}
如果有人可以提供帮助,我们将不胜感激。
答案 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。