【发布时间】:2014-03-30 11:49:28
【问题描述】:
我正在为 Windows Phone 编写我的第一个应用程序,但遇到了问题。我创建了一个按钮,该按钮应该从文本块上的 XML 生成随机条目。 XML 本身如下所示:
<Activities>
<Activity Type="Cooking">
Cook some Mexican food
</Activity>
<Activity Type="Art">
Draw a picture
</Activity>
<Activity Type="Language">
Learn 5 words in Polish you didn't know yet
</Activity>
<Activity Type="Science">
Write a simple program in C
</Activity>
<Activity Type="Sport">
Go to the swimming pool
</Activity>
</Activities>
但是有一个问题。当我按下按钮时,它有时会生成随机条目,但有时它只打印条目的“类型”,有时会同时打印条目和类型。我怎样才能防止这种情况发生?我仍然想为将来的功能加载条目的类型,但我不希望它显示在文本块中。这是我的代码:
类加载一个 XML 文件:
namespace ReadXMLfromFile
{
public class Activities
{
private List<String> activities;
public String getActivities(int i)
{
return activities.ElementAt(i);
}
public List<String> getActivities()
{
return activities;
}
public Activities()
{
IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication();
activities = new List<String>();
if (ISF.FileExists("Activities.xml"))
{
IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("Activities.xml", FileMode.Open, FileAccess.Read, FileShare.Read, ISF);
var aclist = from c in XElement.Load(isoStream).Element("Activities").Elements()
select c;
ISF.Dispose();
isoStream.Dispose();
foreach (var el in aclist)
{
this.activities.Add(el.Value);
if ((string)el.Attribute("Type") == "Cooking")
this.activities.Add("Cooking");
else
if ((string)el.Attribute("Type") == "Art")
this.activities.Add("Art");
else
if ((string)el.Attribute("Type") == "Language")
this.activities.Add("Language");
else
if ((string)el.Attribute("Type") == "Science")
this.activities.Add("Science");
else
if ((string)el.Attribute("Type") == "Sport")
this.activities.Add("Sport");
}
}
else
{
ISF.Dispose();
var aclist = from c in XElement.Load("Assets/Activities.xml").Element("Activities").Elements()
select c;
foreach (var el in aclist)
{
this.activities.Add(el.Value);
if ((string)el.Attribute("Type") == "Cooking")
this.activities.Add("Cooking");
else
if ((string)el.Attribute("Type") == "Art")
this.activities.Add("Art");
else
if ((string)el.Attribute("Type") == "Language")
this.activities.Add("Language");
else
if ((string)el.Attribute("Type") == "Science")
this.activities.Add("Science");
else
if ((string)el.Attribute("Type") == "Sport")
this.activities.Add("Sport");
}
}
}
}
}
这是我的 MainPage 类:
namespace ActivityManager
{
public partial class MainPage : PhoneApplicationPage
{
private Activities ac;
private Random activityNumber;
private int actualActivityNumber;
// Constructor
public MainPage()
{
InitializeComponent();
ac = new Activities();
}
private void RandomButton_Click(object sender, RoutedEventArgs e)
{
RandomTextBox.Text="0";
activityNumber = new Random();
actualActivityNumber = activityNumber.Next(0, ac.getActivities().Count);
RandomTextBox.Text = ac.getActivities(actualActivityNumber);
}
}
}
提前谢谢你。
【问题讨论】:
-
您将元素 和 的值都添加到列表中 - 为什么?我建议您使用
Type和Description属性创建自己的类... -
我这样做是因为我需要它来实现我的应用程序的不同功能。但是,如果我试图只加载没有类型的值,我会在 public String getActivities(int i) 中得到“ArgumentOutOfRangeException 未处理”
-
好吧,在不知道“不同功能”的情况下,很难理解为什么要这样构建代码 - 只要您选择适当的索引,您就不应该得到
ArgumentOutOfRangeException. -
哦,我现在修复了异常。原来我对代码的注释太多了。如果不添加
Type,它实际上可以按预期工作。但是,我想使用ListBox和CheckBoxes为我的XML 中的活动创建一个浏览器。我希望能够根据类型显示它们(CheckBox 仅显示具有选中类型的活动)。我想我需要他们Activity与Type一起这样做。 -
这很好 - 但您应该将其表示为一种数据类型,而不是仅仅将类型和描述都添加到一个字符串列表中。看我回答中的代码。
标签: c# xml windows-phone-7