0

在过去的几周里,我一直在尝试了解 Windows Phone 7 编程的来龙去脉。我已经学习了大部分基础知识,但我一直无法找到一个准确解释如何使用 XML 做某事的教程。我想创建一个非常基本的应用程序,它可以访问网址上的 XML 文件,并将文件中的各种项目显示为应用程序中的文本。我遇到了几个教程,它们似乎都以不同的方式来做,或者没有准确地解释我想做的事情。我不想搜索 XML 文件,我不想更新它,我只想检索它的内容。XML 文件中有“项目”,其中有“标题”和“描述”等类别。我希望该应用程序列出所有项目并在每个项目中显示它'

更具体地说,我知道我使用 {Binding Title} 或 {Binding Description} 将内容绑定到文本块。我只是不确定如何使用 WebClient 或任何最简单的方法连接到文件。显示已在我的解决方案资源管理器中的脱机 XML 文件的内容没有问题。

我确信有一种非常简单的方法可以做到这一点,我非常感谢您的所有帮助。

4

2 回答 2

1

ScottGu 创建了一个应用程序来演示您的需求。(下面的代码非常相似,因为无法从他的示例中找到指向源的链接。)

该应用程序从 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 编写的,但希望它仍然足够简单以使其正常工作。

于 2010-11-09T21:30:38.997 回答
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"));
    }

'

调用它的正确位置是什么?顺便说一句,我很抱歉代码部分没有正确显示。


大家好!谢谢您的帮助!我之前没有创建帐户,所以这可能会显示为答案,因为我在另一台计算机上。我尽我最大的努力将 Twitter 教程改成我想要做的事情。我没有收到任何错误,但它没有在模拟器中显示任何内容。我创建了一个 XML 文件并将其上传到我的个人网站。不幸的是,我无法让代码示例按钮远程工作。所以我很抱歉这看起来很糟糕。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>

'

然而!当我在模拟器中运行应用程序时,我没有收到任何错误,但没有显示任何内容。我知道解决方案可能非常简单,所以我想重申一下您的帮助对我的意义。非常感谢您提供的任何建议。

于 2010-11-10T02:44:10.170 回答