过去几周,我一直在努力学习Windows Phone 7编程的细节。我已经学习了大部分基础知识但是我一直在找一本教程解释如何用XML做些什么。我想创建一个非常基本的应用程序,它可以访问Web地址的XML文件,并在应用程序中将文件中的各个项目显示为文本。我遇到过几个教程,它们似乎都以不同的方式进行,或者没有完全解释我想要做的事情。我不想搜索XML文件,我不想更新它,我只想检索它的内容。在XML文件中是“项目”,其中包括“标题”和“描述”之类的类别。我希望应用程序列出所有项目,并在每个项目中显示它的标题和描述。
更具体地说,我知道我使用{Binding Title}或{Binding Description}将内容绑定到文本块。我只是不确定如何使用WebClient或任何最简单的方法连接到该文件。显示已在我的解决方案资源管理器中的脱机XML文件的内容没有问题。
我确信有一种非常简单的方法可以做到这一点,我非常感谢你的帮助。
答案 0 :(得分:1)
ScottGu created an app展示了您的需求。 (下面的代码与他的例子中找不到源代码的链接非常相似。)
该应用程序从Web服务(在本例中是从Twitter)中检索XML。
private void GetTweets()
{
WebClient twtr = new WebClient();
twtr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
twtr.DownloadStringAsync(new Uri("http://search.twitter.com/search.atom?&q=searchterm"));
}
然后将XML解析为对象集合。
void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
return;
XElement xmlTweets = XElement.Parse(e.Result);
var list = new List<TweetViewModel>();
foreach (XElement t in xmlTweets.Elements("{http://www.w3.org/2005/Atom}entry"))
{
var userName = t.Element("{http://www.w3.org/2005/Atom}author").Element("{http://www.w3.org/2005/Atom}name").Value.Split(' ')[0];
var message = t.Element("{http://www.w3.org/2005/Atom}title").Value;
var imageSource = (from t2 in t.Elements("{http://www.w3.org/2005/Atom}link")
where t2.Attribute("type").Value.Contains("image")
select t2.Attribute("href").Value).First();
list.Add(new TweetViewModel
{
UserName = userName,
Message = message,
ImageSource = imageSource
});
}
twitterList.ItemsSource = list;
}
public class TweetViewModel
{
public string UserName { get; set; }
public string Message { get; set; }
public string ImageSource { get; set; }
}
然后将其绑定到列表。
<ListBox HorizontalAlignment="Left" Name="twitterList" VerticalAlignment="Top" Width="476">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="132">
<Image Source="{Binding ImageSource}" Height="73" Width="73" VerticalAlignment="Top" Margin="0,10,8,0"/>
<StackPanel Width="370">
<TextBlock Text="{Binding UserName}" Foreground="#FFC8AB14" FontSize="28" />
<TextBlock Text="{Binding Message}" TextWrapping="Wrap" FontSize="24" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
它是用工具/ SDK的第一个CTP编写的,但希望它仍然应该足够简单以使其正常工作。
答案 1 :(得分:0)
更新:
我认为当我调用GetRoster时问题可能是对的。这是我称之为的上下文:
namespace TwitterMix
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
}
private void GetRoster()
{
WebClient rstr = new WebClient();
rstr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(roster_DownloadStringCompleted);
rstr.DownloadStringAsync(new Uri("http://www.danfess.com/data.xml"));
}
调用它的正确位置是什么?顺便说一句,我很抱歉代码部分没有正确显示。
<?xml version="1.0" encoding="utf-8" ?>
<roster>
<person><name>Blake</name><age>25</age></person>
<person><name>Jane</name><age>29</age></person>
<person><name>Bryce</name><age>29</age></person>
<person><name>Colin</name><age>29</age></person>
</roster>
这是MainPage.xaml.cs:
private void GetRoster()
{
WebClient rstr = new WebClient();
rstr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(roster_DownloadStringCompleted);
rstr.DownloadStringAsync(new Uri("http://www.MyPersonalWebsiteURL.com/data.xml"));
}
void roster_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
return;
XElement xmlPersons = XElement.Parse(e.Result);
var list = new List<RosterViewModel>();
foreach (XElement person in xmlPersons.Elements("person"))
{
var name = person.Element("name").Value;
var age = person.Element("age").Value;
list.Add(new RosterViewModel
{
Name = name,
Age = age,
});
}
rosterList.ItemsSource = list;
}
public class RosterViewModel
{
public string Name { get; set; }
public string Age { get; set; }
}
}
现在MainPage.xaml:
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox HorizontalAlignment="Left" Name="rosterList" ItemsSource="rosterList" VerticalAlignment="Top" Width="476">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="132">
<StackPanel Width="370">
<TextBlock Text="{Binding Name}" Foreground="#FFC8AB14" FontSize="28" />
<TextBlock Text="{Binding Age}" TextWrapping="Wrap" FontSize="24" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
然而!当我在模拟器中运行应用程序时,我没有收到任何错误,但没有任何内容显示。我知道解决方案可能非常简单,所以我想重申一下你的帮助对我意味着什么。非常感谢您提供的任何建议。