0

今日上映される映画の日付を表示しようとしています。私は一日中さまざまなスレッドを読んでいますが、webRequest を機能させることができません。

基本的に、私は webClient で作業するコードを持っていましたが、UI をレスポンシブにしたかったので、httpWebRequest を使用して xml が UI スレッドから離れて解析されるようにすることにしました。

public partial class MainPage : PhoneApplicationPage {



public MainPage() {
  InitializeComponent();
}

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) {
  DoHttpWebRequest();
}


private void DoHttpWebRequest() {
  string url = "http://www.cinamon.ee/rss/schedule/1001.xml";
  var request = HttpWebRequest.Create(url);
  var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);
}

private void ResponseCallback(IAsyncResult result) {
  var request = (HttpWebRequest)result.AsyncState;
  var response = request.EndGetResponse(result);

  using (var stream = response.GetResponseStream()) {

    XDocument scheduleXml = XDocument.Load(stream);
    var todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
                      where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
                      DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0
                      select new Movie() {
                        MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)),
                        MovieName = (string)query.Element("title"),
                        MovieId = (string)query.Element("movieId"),
                        MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
                      };

    // Removing duplicate movies from list.
    List<Movie> todayList = todayMovies.ToList();
    IEnumerable<Movie> noDuplicates3 = todayList.Distinct(new MovieComparer());

    // Adding to the UI
    Dispatcher.BeginInvoke(() => {
      todayBox.ItemsSource = noDuplicates.ToList();
    });
  }

}
}

このコードを見て、何が問題なのかわかる人はいますか?

編集ありがとうございます。これは私のソリューションのベースとなったリンクです - http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/594e1422-3b69-4cd2-a09b-fb500d5eb1d8

EDIT2。私のメインページ.xaml

<StackPanel x:Name="TodayPanel" Grid.Row="1" Margin="10,5,10,10" Orientation="Horizontal" Height="580" Background="#90000000" >
      <ListBox x:Name="todayBox">
        <ListBox.ItemTemplate>
          <DataTemplate>
            <HyperlinkButton x:Name="hyperLinkButton" Style="{StaticResource HyperlinkButtonStyle1}" CommandParameter="{Binding MovieId}" Tap="hyperLinkButton_Tap">
              <HyperlinkButton.Content>
                <StackPanel Margin="10" Grid.Row="1" Orientation="Horizontal">
                  <Image Source="{Binding MoviePicture}" />
                  <StackPanel Margin="10" Grid.Row="1" Orientation="Vertical">
                    <TextBlock TextWrapping="Wrap" Margin="10, 5, 10, 5"  Width="200" FontFamily="Trebuchet MS" Foreground="Orange" VerticalAlignment="Top">
                                        <Run Text="{Binding MovieName}"/>
                                        <LineBreak></LineBreak>
                    </TextBlock>
                    <TextBlock TextWrapping="Wrap" Width="200" FontFamily="Trebuchet MS" Foreground="White" VerticalAlignment="Bottom">
                                        <Run Text="Järgmine seanss: "/>
                                        <LineBreak></LineBreak>
                                        <Run Text="{Binding MovieSoonest}"/>
                    </TextBlock>
                  </StackPanel>
                </StackPanel>
              </HyperlinkButton.Content>
            </HyperlinkButton>
          </DataTemplate>
        </ListBox.ItemTemplate>
      </ListBox>
    </StackPanel>

そして私の編集されたコードビハインド。

private void DoHttpWebRequest() {
  string url = "http://www.cinamon.ee/rss/schedule/1001.xml";
  var request = HttpWebRequest.Create(url);
  var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);
}

private void ResponseCallback(IAsyncResult result) {
  var request = (HttpWebRequest)result.AsyncState;
  var response = request.EndGetResponse(result);

  // Adding to the UI
  Dispatcher.BeginInvoke(() => {
    IEnumerable<Movie> todayMovies;
    using (var stream = response.GetResponseStream()) {

      XDocument scheduleXml = XDocument.Load(stream);
      todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
                    where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
                    DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0
                    select new Movie() {
                      MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)),
                      MovieName = (string)query.Element("title"),
                      MovieId = (string)query.Element("movieId"),
                      MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
                    };
    }

      var todayList = todayMovies.ToList();
      //IEnumerable<Movie> noDuplicates = movieList.Distinct(new MovieComparer());

      todayBox.ItemsSource = todayList.ToList();



    });
4

1 に答える 1

1

私はあなたのコードを試してみて、UnauthorizedAccessException を取得しました。Dispactcher.Begininvoke デリゲートのスコープを変更すると、次のように動作します。

private void ResponseCallback(IAsyncResult result){
var request = (HttpWebRequest) result.AsyncState;
var response = request.EndGetResponse(result);
// Adding to the UI
Dispatcher.BeginInvoke(() =>
{
IEnumerable<Movie> todayMovies;
using (var stream = response.GetResponseStream())
{

    XDocument scheduleXml = XDocument.Load(stream);
    todayMovies =
        from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
        where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
                DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) >
                0
        select new Movie()
                    {
                        MoviePicture =
                            new BitmapImage(
                            new Uri((string) query.Element("images").Element("imageType2").Value,
                                    UriKind.RelativeOrAbsolute)),
                        MovieName = (string) query.Element("title"),
                        MovieId = (string) query.Element("movieId"),
                        MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
                    };

}
// Removing duplicate movies from list.
var todayList = todayMovies.ToList();
    //IEnumerable<Movie> noDuplicates3 = todayList.Distinct(new MovieComparer());


                                    todayBox.ItemsSource = todayList.ToList();
                                });

}

ただし、より簡単にするために、RestSharp ライブラリ (Nuget にある場合があります) を使用できます。次のコードを確認してください。

public void RestSample(){
var client = new RestClient
{
    BaseUrl = "http://www.cinamon.ee/"
};

var request = new RestRequest
{
    Resource = "rss/schedule/1001.xml"
};

client.ExecuteAsync(request, (a) =>
{
    if (a.StatusCode == HttpStatusCode.OK)
    {
        var scheduleXml = XDocument.Parse(a.Content);

        var todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show")
                            where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) &&
                            DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0
                            select new Movie()
                            {
                                MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)),
                                MovieName = (string)query.Element("title"),
                                MovieId = (string)query.Element("movieId"),
                                MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm")
                            };

        // Removing duplicate movies from list.
        List<Movie> todayList = todayMovies.ToList();
        //IEnumerable<Movie> noDuplicates = todayList.Distinct(new MovieComparer());

        // Adding to the UI
        Dispatcher.BeginInvoke(() =>
        {
            todayBox.ItemsSource = todayList.ToList();
        });
    }
    else
    {
        //error
    }
});

}

それを試して、私たちに知らせてください...

編集: xaml.cs データテンプレート:

        <StackPanel x:Name="TodayPanel" Grid.Row="1" Margin="10,5,0,10" Orientation="Horizontal" Height="580" Background="#90000000" >
        <ListBox x:Name="todayBox" Width="468">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="10" Orientation="Horizontal">
                                <Image Source="{Binding MoviePicture, FallbackValue=http://www.cinamon.ee/visinternetticketing/images/movies/NowShowingComingSoon/HungerGames.jpg}" />
                                <StackPanel Margin="10" Grid.Row="1" Orientation="Vertical">
                                    <TextBlock TextWrapping="Wrap" Margin="10, 5, 10, 5" FontFamily="Trebuchet MS" Foreground="Orange" VerticalAlignment="Top" Text="{Binding MovieName}"/>
                                    <TextBlock TextWrapping="Wrap" FontFamily="Trebuchet MS" Foreground="White" VerticalAlignment="Bottom" Text="{Binding MovieSoonest}"/>
                                </StackPanel>
                                <HyperlinkButton x:Name="hyperLinkButton" CommandParameter="{Binding MovieId}" />
                            </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>

RECALL MovePicture プロパティを BitmapImage から string に変更します

上記の DataTemplate を使用した結果です

于 2012-04-16T13:29:02.567 に答える