0

ここ数週間、Windows Phone 7 プログラミングのすべてを学ぼうとしてきました。私はほとんどの基本を学びましたが、XML で何かを行う方法を正確に説明するチュートリアルを見つけるのに苦労しています。Web アドレスで 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 ファイルを作成し、個人の Web サイトにアップロードしました。残念ながら、コード サンプル ボタンをリモートでもうまく機能させることができません。なので、見栄えが悪くてすみません。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 に答える