Dùng Syndication đọc RSS trên WP7

Đọc tin tức là nhu cầu thiết yếu của mọi người. Và bạn có thể phát triển một ứng dụng đọc RSS rất dễ dàng với bài hướng dẫn sau đây!

Add references sau:

1. System.ServiceModel.Syndication.dll

(C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\)

2. System.Xml.dll

(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\)

3. System.Xml.Linq.dll

(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\)

4. Mở Tool > Library Package Manager > Package Manager Console > chạy đoạn lệnh này (để sử dụng asynchronous trên WP7):

Install-Package Microsoft.Bcl.Async -Pre

Code:

ListBox chứa các items:

<ListBox x:Name="rssNews">
	<ListBox.ItemTemplate>
		<DataTemplate>
			<Grid Width="{Binding ElementName=mainItems, Path=ActualWidth}" Height="240″ Tap="item_Tap" Margin="20,10,20,10″>
				<Grid.Background>
					<ImageBrush Stretch="Fill" ImageSource="{Binding Summary.Text, Converter={StaticResource getImage}}“/>
				</Grid.Background>
				<Image Source="{Binding Summary.Text, Converter={StaticResource getImage}}"/>
				<Grid Background="#CC34CEE6″ Height="80″ VerticalAlignment="Bottom">
					<TextBlock Text="{Binding Title.Text}" TextWrapping="Wrap" Margin="12,10,12,0″ Foreground="White" FontSize="30″ TextTrimming="WordEllipsis"/>
				</Grid>
			</Grid>
		</DataTemplate>
	</ListBox.ItemTemplate>
</ListBox>

Các bạn lưu ý: vì SyndicationItem không chứa property của image bài viết, nên bạn phải có một hàm để lọc image trong SyndicationItem.Summary.Text (chứa phần Description của một bài RSS):

	public class getImage : IValueConverter

    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return null;

            string imageLink = "";
            try
            {
                imageLink = value.ToString().Substring("..."); // các bạn xem mã nguồn của một bài RSS để lọc ảnh trong Description ra bằng Regex hay substring, remove gì cũng được, nhưng cuối cùng phải set cho imageLink có dạng imageLink = "http:// abc.com/123.jpg"
            }
            catch
            {

            }
            return imageLink ;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Add Resources cho hàm getImage vào App.xaml:

<Application.Resources>
<converter:getImage xmlns:converter="clr-namespace:projectname" x:Key="getImage"> // sửa projectname lại nhé
</Application.Resources>

Code binding dữ liệu vào listbox:

        protected async override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            try
            {
                WebClient wc = new WebClient();
                string xmlFeedData = await wc.DownloadStringTaskAsync(new Uri("http:// abc.com/news.rss"));
                StringReader stringReader = new StringReader(xmlFeedData);
                XmlReader xmlReader = XmlReader.Create(stringReader);
                SyndicationFeed feed = SyndicationFeed.Load(xmlReader);

                rssNews.ItemsSource = feed.Items.ToList<SyndicationItem>();
            }
            catch
            {
            }
        }

Cuối cùng là sự kiện Tap lên item:

        public static SyndicationItem si;
        private void item_Tap(object sender, GestureEventArgs e)
        {
            si = new SyndicationItem();
            si = (sender as Grid).DataContext as SyndicationItem;

            NavigationService.Navigate(new Uri("/ViewPage.xaml", UriKind.Relative)); //qua ViewPage.xaml các bạn gọi MainPage.si.Links.FirstOrDefault().Uri để lấy URL bài viết và navigate vào một cái WebBrowser hay gì đó là ý tưởng của bạn nhé
        }
Vậy là bạn đã có một ứng dụng đọc RSS trên Windows Phone rồi, rất đơn giản đúng không?

Chúc các bạn thành công!

Advertisements

6 thoughts on “Dùng Syndication đọc RSS trên WP7

  1. bạn có thể giải thích thêm chỗ : (các bạn xem mã nguồn của một bài RSS để lọc ảnh trong Description ra bằng Regex hay substring, remove gì cũng được, nhưng cuối cùng phải set cho imageLink có dạng imageLink = “http:// abc.com/123.jpg”)
    mình chưa hiểu lắm. thank !

  2. hi bạn, bạn để ý trong một cấu trúc của RSS Item có dạng

    <item>
        <title>Microsoft mua lại Nokia</title>
        <link>www.thongtincongnghe.com/abc</link>
        <description><img src="vtcdn.com/sites/default/files/imagecache/s72/images/2013/3/22/img-1363908268-1.jpg" align="left" style="margin-right:5px"/>Vừa qua tập đoàn Microsoft đã...
        </description>
    </item>
    

    nghĩa là bạn phải làm sao để lấy ảnh trong tag “Description” ra, mình ví dụ ở đây là:

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null) return null;
     
            string imageLink = "";
            try
            {
                imageLink = value.ToString().Remove(value.ToString().IndexOf(".jpg") + 4);
                imageLink = imageLink.SubString(imageLink.IndexOf("src=\"") + 5);
            }
            catch
            {
     
            }
            return imageLink ;
        }
    

    Cuối cùng nó sẽ lấy ra được ảnh: http://vtcdn.com/sites/default/files/imagecache/s72/images/2013/3/22/img-1363908268-1.jpg

    Ảnh này sẽ tự binding vô XAML theo cấu trúc XAML mình đề cập ở “ListBox chứa các Items” nha bạn!

    Bạn có thể tham khảo ứng dụng Tin Công Nghệ sẽ thấy được mỗi bài viết sẽ có một hình ảnh đại diện:
    http://www.windowsphone.com/vi-vn/store/app/tin-c%C3%B4ng-ngh%E1%BB%87/e56f59d1-3574-467e-8e46-251842e2fd11

    Chúc bạn thành công!

  3. Bạn ơi cho mình hỏi thêm một chút có nhiều link nó bị lỗi là nó bị sao vậy(link của genk…..). có link thì chạy tốt nhưng không load được hình ảnh , có link thì chạy có hình ảnh, như link của vietnamnet hặc của tinhte thì được

  4. bạn xem lại mã nguồn của phần description của 1 item xem nó thế nào, có một số trang không có hình nên không thể lọc được đó bạn

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s