该问题已经过彻底修改,以更新我的工作。
[编辑]
我正在学习C#而我正在尝试解析" http://www.watchfree.to"使用Html-Agility-Pack
进入我的UWP应用程序。我能够进行解析,并获得了我需要的内容。
我的应用程序绑定到GridView
,并在那里显示某些内容的Images and Titles
。我在我的x:Bind
中使用了MainPage
,但它只在第一次加载页面时更新内容,我已经实现了INotifyPropertyChanged
事件,但仍然发生了同样的情况,内容不会更新时它改变。此外,图像不会在运行时更新,因为目前我必须先将它们下载到TempFolder
,然后使用文件夹的Path
作为字符串来显示图像。
我的代码文件如下:
MainPage.xaml中
//
<Page
x:Class="WatchfreeWebsite.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WatchfreeWebsite"
xmlns:data="using:WatchfreeWebsite"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Loading="MainPage_Loading"
Loaded="MainPage_Loaded">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
x:Name="mgrid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="AUto"/>
</Grid.RowDefinitions>
<StackPanel x:Name="PageHeader">
<TextBlock Text="Watcfree.to"
TextAlignment="Center"
FontSize="20"
TextWrapping="Wrap"/>
<TextBlock Text="Stream Movies and TV Shows"
TextAlignment="Center"
TextWrapping="Wrap"/>
<ProgressRing x:Name="ProgRing"/>
<TextBlock x:Name="nodeText"
Height="auto"
Width="auto"
TextAlignment="Center"
TextWrapping="Wrap"
/>
</StackPanel>
<GridView Grid.Row="1"
ItemsSource="{x:Bind MoviesList, Mode=OneWay}"
x:Name="dataGrid"
SelectionChanged="dataGrid_SelectionChanged">
<GridView.ItemTemplate>
<DataTemplate x:DataType="data:PopularMoviesClass">
<StackPanel
Margin="0,10,0,10">
<TextBlock Name="Title"
Text="{x:Bind MovieTitle, Mode=OneWay}"
TextAlignment="Center"
IsTextSelectionEnabled="True"
TextWrapping="Wrap"
Height="40"
Width="200"/>
<Image x:Name="CoverImage"
Source="{x:Bind ImageLink, Mode=OneWay}"
Width="180"
Height="250"/>
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
<StackPanel Grid.Row="2"
Margin="0,10,0,10"
Orientation="Horizontal"
HorizontalAlignment="Center">
<Button x:Name="RefreshPageBtn"
Content="Refresh Page"
Click="RefreshPageBtn_Click"/>
<Button x:Name="RefreshLayoutBtn"
Content="Refresh Layout"
Margin="10,0,0,0"
Click="RefreshLayoutBtn_Click"/>
</StackPanel>
</Grid>
MainPage.xaml.cs中
//
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using HtmlAgilityPack;
using System.Net.Http;
using Windows.Storage.Streams;
using Windows.Storage;
using System.Threading.Tasks;
namespace WatchfreeWebsite
{
public sealed partial class MainPage : Page
{
public static string[] MoviesImageLinks = new string[30];
public static string[] MoviesTitles = new string[30];
public static string[] PageLinks = new string[30];
//public static int[] MoviesIDs = new int[30];
public static readonly string MoviesBaseLink = "http://watchfree.to";
public static StorageFolder TempFolder = ApplicationData.Current.TemporaryFolder;
public List<PopularMoviesClass> MoviesList;
PopularMoviesClass MovieTitle = new PopularMoviesClass();
PopularMoviesClass ImageLink = new PopularMoviesClass();
public MainPage()
{
InitializeComponent();
MovieTitle.PropertyChanged += MovieTitle_PropertyChanged;
ImageLink.PropertyChanged += ImageLink_PropertyChanged;
DataContext = MovieTitle;
DataContext = ImageLink;
//this.DataContextChanged += (s, e) => this.Bindings.Update();
}
private void ImageLink_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
Bindings.Update();
}
private void MovieTitle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
Bindings.Update();
}
private void MainPage_Loading(FrameworkElement sender, object args)
{
LoadPage();
MoviesList = MovieManager.GetMovies();
}
private async void LoadPage()
{
try
{
nodeText.Text = "Connecting to server...";
ProgRing.IsActive = true;
string url = MoviesBaseLink;
HtmlWeb webPage = new HtmlWeb();
HtmlDocument doc = await webPage.LoadFromWebAsync(url);
nodeText.Text = "Fetching links...";
// finding image links in page
IEnumerable<HtmlNode> _links = doc.DocumentNode.Descendants("img").Where(d => d.Attributes.Contains("src"));
int LinkID = 0;
foreach (var link in _links)
{
if (link != null)
{
MoviesImageLinks[LinkID] = string.Format("http:{0}", link.Attributes["src"].Value);
}
LinkID++;
}
nodeText.Text = "Fetching titles...";
// finding titles in page
int LinkID2 = 0;
IEnumerable<HtmlNode> _titles = doc.DocumentNode.Descendants("a").Where(t => t.Attributes.Contains("title"));
foreach (var link in _titles)
{
if (link != null)
{
if (link.InnerText != "WatchFree.to" && link.InnerText != "Movies" && link.InnerText != "TV Shows")
{
string x = link.GetAttributeValue("title", null);
x = x.Replace("Watch Putlocker", "");
x = x.Trim();
MoviesTitles[LinkID2] = x;
MovieTitle.MovieTitle = MoviesTitles[LinkID2];
LinkID2++;
}
}
}
//TitleFile(MoviesTitles);
nodeText.Text = "Fetching images...";
// downloading images
int LinkID3 = 0;
foreach (var link in MoviesImageLinks)
{
if (link != null)
{
DownloadImages(link, LinkID3);
}
LinkID3++;
}
}
catch (Exception ex)
{
ErrorDialog(ex.Message);
}
finally
{
ProgRing.Visibility = Visibility.Collapsed;
nodeText.Visibility = Visibility.Collapsed;
//MoviesList = MovieManager.GetMovies();
}
}
private async void DownloadImages(string url, int ID)
{
try
{
await TempFolder.CreateFolderAsync("CoverPics", CreationCollisionOption.OpenIfExists);
var CoverPicFolder = await TempFolder.GetFolderAsync("CoverPics");
var fileName = string.Format("MovieID_{0}.jpg", ID);
var coverpic_file = await CoverPicFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
HttpClient client = new HttpClient(); // Create HttpClient
byte[] buffer = await client.GetByteArrayAsync(url); // Download file
using (Stream stream = await coverpic_file.OpenStreamForWriteAsync())
{
stream.Write(buffer, 0, buffer.Length);
}
}
catch (Exception ex)
{
ErrorDialog(ex.Message);
}
}
private async void ErrorDialog(string error)
{
MessageDialog md = new MessageDialog(error);
md.Title = "Handled Exception";
md.Content = error;
md.Commands.Add(new UICommand("Okay"));
await md.ShowAsync();
}
private void RefreshPageBtn_Click(object sender, RoutedEventArgs e)
{
RefreshPage();
}
private void RefreshPage()
{
Frame.Navigate(typeof(MainPage));
Frame.BackStack.Remove(Frame.BackStack.Last());
}
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
;
}
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
;
}
private async void TitleFile(string[] title)
{
try
{
var CoverPicFolder = await TempFolder.GetFolderAsync(@"CoverPics");
var fileName = @"Movies_Titles.txt";
var txtFile = await CoverPicFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
foreach(string line in title)
{
await FileIO.WriteTextAsync(txtFile, string.Format(@"{0}\n", line));
}
}
catch(Exception ex)
{
ErrorDialog(ex.Message);
}
}
private void RefreshLayoutBtn_Click(object sender, RoutedEventArgs e)
{
this.Bindings.Initialize();
this.Bindings.Update();
}
}
}
PopularMovies.cs(持有列表的类)
//
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
namespace WatchfreeWebsite
{
public class PopularMoviesClass : INotifyPropertyChanged
{
private int _MovieID;
private string _MovieTitle;
private string _ImageLink;
public int MovieID
{
get { return _MovieID; }
set
{
if (_MovieID != value)
{
_MovieID = value;
OnPropertyChanged();
}
}
}
public string MovieTitle
{
get { return _MovieTitle; }
set
{
if (_MovieTitle != value)
{
_MovieTitle = value;
OnPropertyChanged();
}
}
}
public string ImageLink
{
get { return _ImageLink; }
set
{
if (_ImageLink != value)
{
_ImageLink = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
//Image img = new Image();
//img.Source = new BitmapImage(new Uri("ms-appx:///Assets/Logo.png"));
protected void OnPropertyChanged([CallerMemberName] string setting = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(setting));
}
}
public class MovieManager
{
public static List<PopularMoviesClass> GetMovies()
{
var movies = new List<PopularMoviesClass>();
string ImagePath = string.Format(@"{0}/CoverPics/", MainPage.TempFolder.Path);
movies.Add(new PopularMoviesClass { MovieID = 1, MovieTitle = MainPage.MoviesTitles[0], ImageLink = ImagePath + "MovieID_0.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 2, MovieTitle = MainPage.MoviesTitles[1], ImageLink = ImagePath + "MovieID_1.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 3, MovieTitle = MainPage.MoviesTitles[2], ImageLink = ImagePath + "MovieID_2.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 4, MovieTitle = MainPage.MoviesTitles[3], ImageLink = ImagePath + "MovieID_3.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 5, MovieTitle = MainPage.MoviesTitles[4], ImageLink = ImagePath + "MovieID_4.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 6, MovieTitle = MainPage.MoviesTitles[5], ImageLink = ImagePath + "MovieID_5.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 7, MovieTitle = MainPage.MoviesTitles[6], ImageLink = ImagePath + "MovieID_6.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 8, MovieTitle = MainPage.MoviesTitles[7], ImageLink = ImagePath + "MovieID_7.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 9, MovieTitle = MainPage.MoviesTitles[8], ImageLink = ImagePath + "MovieID_8.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 10, MovieTitle = MainPage.MoviesTitles[9], ImageLink = ImagePath + "MovieID_9.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 11, MovieTitle = MainPage.MoviesTitles[10], ImageLink = ImagePath + "MovieID_10.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 12, MovieTitle = MainPage.MoviesTitles[11], ImageLink = ImagePath + "MovieID_11.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 13, MovieTitle = MainPage.MoviesTitles[12], ImageLink = ImagePath + "MovieID_12.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 14, MovieTitle = MainPage.MoviesTitles[13], ImageLink = ImagePath + "MovieID_13.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 15, MovieTitle = MainPage.MoviesTitles[14], ImageLink = ImagePath + "MovieID_14.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 16, MovieTitle = MainPage.MoviesTitles[15], ImageLink = ImagePath + "MovieID_15.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 17, MovieTitle = MainPage.MoviesTitles[16], ImageLink = ImagePath + "MovieID_16.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 18, MovieTitle = MainPage.MoviesTitles[17], ImageLink = ImagePath + "MovieID_17.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 19, MovieTitle = MainPage.MoviesTitles[18], ImageLink = ImagePath + "MovieID_18.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 20, MovieTitle = MainPage.MoviesTitles[19], ImageLink = ImagePath + "MovieID_19.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 21, MovieTitle = MainPage.MoviesTitles[20], ImageLink = ImagePath + "MovieID_20.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 22, MovieTitle = MainPage.MoviesTitles[21], ImageLink = ImagePath + "MovieID_21.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 23, MovieTitle = MainPage.MoviesTitles[22], ImageLink = ImagePath + "MovieID_22.jpg" });
movies.Add(new PopularMoviesClass { MovieID = 24, MovieTitle = MainPage.MoviesTitles[23], ImageLink = ImagePath + "MovieID_23.jpg" });
return movies;
}
}
}
我可以在使用Titles
解析后更新Page Refresh
,但如果图像已经可用,则图像仍然无法更新。我必须关闭应用程序并再次运行它以更新图像。
有人可以解释我在这里做错了什么吗?上面提供了所有代码。它可以在VS Community 2015中复制和运行。