我正在尝试显示电影的电影日期,而不是今天要播放的电影。我一整天都在读不同的帖子,买不到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();
});
答案 0 :(得分: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 datatemplate:
<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 将BitmapImage的MovePicture属性更改为字符串。