내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 기본 RSS 수집기를 만드는 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

다음 단계를 완료하여 기본 RSS 수집기를 만들 수 있습니다. 여기에 제공되는 지침과 코드 예제는 RSS 수집기 샘플이라는 코드 샘플을 기반으로 합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

Visual Studio에서 새 Windows Phone 앱 프로젝트를 만듭니다.

SyndicationFeed 클래스를 사용하려면 먼저 DLL 참조를 추가해야 합니다.

신디케이션 DLL에 대한 참조를 추가하려면

  1. Visual Studio의 프로젝트 메뉴에서 참조 추가, 찾아보기 탭을 차례로 선택합니다.

  2. 프로그램 파일(x86) 디렉터리로 이동합니다.

  3. Microsoft SDKs/Silverlight/v4.0/Libraries/Client/로 이동합니다.

  4. System.ServiceModel.Syndication.dll을 선택하고 확인을 클릭합니다.

    참고참고:

    이 단계에서 계속할 것인지 묻는 메시지가 표시되면 를 클릭합니다.

RSS 피드의 설명 텍스트에는 대체로 HTML, 인코딩된 문자 및 RSS 수집기에 표시하지 않으려는 기타 데이터가 포함될 수 있습니다. 설명 텍스트에서 HTML 및 불필요한 기타 데이터를 제거하는 클래스를 만들고 이 클래스를 XAML 필드의 변환기로 설정할 수 있습니다.

RSS 텍스트 다듬기 도구를 만들려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다.

  2. 설치된 템플릿 창에서 Visual C#을 선택한 다음 중간 창에서 클래스를 선택합니다.

  3. 파일 이름을 RssTextTrimmer.cs로 지정하고 추가를 클릭합니다.

  4. 솔루션 탐색기에서 RssTextTrimmer.cs 파일을 두 번 클릭합니다.

  5. 다음 네임스페이스를 추가합니다.

    using System.Windows.Data;
    using System.Globalization;
    using System.Text.RegularExpressions;
    
    
  6. IValueConverter 인터페이스를 구현하도록 클래스 정의를 업데이트합니다.

    public class RssTextTrimmer : IValueConverter
    
    
  7. RssTextTrimmer 클래스 내부에 다음 코드를 추가합니다.

    // Clean up text fields from each SyndicationItem. 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null) return null;
    
        int maxLength = 200;
        int strLength = 0;
        string fixedString = "";
    
        // Remove HTML tags and newline characters from the text, and decode HTML encoded characters. 
        // This is a basic method. Additional code would be needed to more thoroughly  
        // remove certain elements, such as embedded Javascript. 
    
        // Remove HTML tags. 
        fixedString = Regex.Replace(value.ToString(), "<[^>]+>", string.Empty);
    
        // Remove newline characters.
        fixedString = fixedString.Replace("\r", "").Replace("\n", "");
    
        // Remove encoded HTML characters.
        fixedString = HttpUtility.HtmlDecode(fixedString);
    
        strLength = fixedString.ToString().Length;
    
        // Some feed management tools include an image tag in the Description field of an RSS feed, 
        // so even if the Description field (and thus, the Summary property) is not populated, it could still contain HTML. 
        // Due to this, after we strip tags from the string, we should return null if there is nothing left in the resulting string. 
        if (strLength == 0)
        {
            return null;
        }
    
        // Truncate the text if it is too long. 
        else if (strLength >= maxLength)
        {
            fixedString = fixedString.Substring(0, maxLength);
    
            // Unless we take the next step, the string truncation could occur in the middle of a word.
            // Using LastIndexOf we can find the last space character in the string and truncate there. 
            fixedString = fixedString.Substring(0, fixedString.LastIndexOf(" "));
        }
    
        fixedString += "...";
    
        return fixedString;
    }
    
    // This code sample does not use TwoWay binding, so we do not need to flesh out ConvertBack.  
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    
    
  8. 솔루션 탐색기에서 App.xaml을 두 번 클릭하고 <Application.Resources> 태그 내부에 다음 코드를 추가하여 RssTextTrimmer 클래스를 변환기로 설정합니다.

    <converter:RssTextTrimmer xmlns:converter="clr-namespace:namespace" x:Key="RssTextTrimmer" />
    
    

    여기서 namespace는 프로젝트의 네임스페이스 이름입니다. 예를 들어 Windows Phone 8의 기본 RSS 수집기 샘플에서 namespace는 sdkBasicRSSReaderWP8CS로 바뀝니다.

XAML 코드를 업데이트하려면

  1. 솔루션 탐색기에서 MainPage.xaml 파일을 두 번 클릭합니다.

  2. <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>를 다음 XAML 코드로 바꿉니다.

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="0,0,12,0">
        <Button Content="Load Feed" Height="72" HorizontalAlignment="Left" Margin="9,6,0,0" Name="loadFeedButton" VerticalAlignment="Top" Width="273" Click="loadFeedButton_Click" />
    
        <ListBox Name="feedListBox" Height="468" HorizontalAlignment="Left" Margin="20,100,0,0" VerticalAlignment="Top" Width="444" ScrollViewer.VerticalScrollBarVisibility="Auto" SelectionChanged="feedListBox_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel VerticalAlignment="Top">
                        <TextBlock TextDecorations="Underline" FontSize="24" Name="feedTitle" TextWrapping="Wrap" Margin="12,0,0,0" HorizontalAlignment="Left" Foreground="{StaticResource PhoneAccentBrush}" Text="{Binding Title.Text, Converter={StaticResource RssTextTrimmer}}" />
                        <TextBlock Name="feedSummary" TextWrapping="Wrap" Margin="12,0,0,0" Text="{Binding Summary.Text, Converter={StaticResource RssTextTrimmer}}" />
                        <TextBlock Name="feedPubDate" Foreground="{StaticResource PhoneSubtleBrush}" Margin="12,0,0,10" Text="{Binding PublishDate.DateTime}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Border BorderBrush="{StaticResource PhoneSubtleBrush}" BorderThickness="1" Height="2" HorizontalAlignment="Left" Margin="20,88,0,0" Name="border1" VerticalAlignment="Top" Width="438" />
    </Grid>
    
    

코드 숨김 파일을 업데이트하려면

  1. 다음 네임스페이스를 추가합니다.

    using System.IO;
    using System.ServiceModel.Syndication;
    using System.Xml;
    using Microsoft.Phone.Tasks;
    
    
  2. MainPage 클래스 내부의 MainPage 생성자 뒤에 다음 코드를 추가합니다.

    참고참고:

    다음 코드에는 기본 삭제 표식 지원도 포함되어 있습니다.

    // Click handler that runs when the 'Load Feed' or 'Refresh Feed' button is clicked. 
    private void loadFeedButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // WebClient is used instead of HttpWebRequest in this code sample because 
        // the implementation is simpler and easier to use, and we do not need to use 
        // advanced functionality that HttpWebRequest provides, such as the ability to send headers.
        WebClient webClient = new WebClient();
    
        // Subscribe to the DownloadStringCompleted event prior to downloading the RSS feed.
        webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
    
        // Download the RSS feed. DownloadStringAsync was used instead of OpenStreamAsync because we do not need 
        // to leave a stream open, and we will not need to worry about closing the channel. 
        webClient.DownloadStringAsync(new System.Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx"));
    }
    
    // Event handler which runs after the feed is fully downloaded.
    private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                // Showing the exact error message is useful for debugging. In a finalized application, 
                // output a friendly and applicable string to the user instead. 
                MessageBox.Show(e.Error.Message);
            });
        }
        else
        {
            // Save the feed into the State property in case the application is tombstoned. 
            this.State["feed"] = e.Result;
    
            UpdateFeedList(e.Result);
        }
    }
    
    // This method determines whether the user has navigated to the application after the application was tombstoned.
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        // First, check whether the feed is already saved in the page state.
        if (this.State.ContainsKey("feed"))
        {
            // Get the feed again only if the application was tombstoned, which means the ListBox will be empty.
            // This is because the OnNavigatedTo method is also called when navigating between pages in your application.
            // You would want to rebind only if your application was tombstoned and page state has been lost. 
            if (feedListBox.Items.Count == 0)
            {
                UpdateFeedList(State["feed"] as string);
            }
        }
    }
    
    // This method sets up the feed and binds it to our ListBox. 
    private void UpdateFeedList(string feedXML)
    {
        // Load the feed into a SyndicationFeed instance.
        StringReader stringReader = new StringReader(feedXML);
        XmlReader xmlReader = XmlReader.Create(stringReader);
        SyndicationFeed feed = SyndicationFeed.Load(xmlReader);
    
        // In Windows Phone OS 7.1 or later versions, WebClient events are raised on the same type of thread they were called upon. 
        // For example, if WebClient was run on a background thread, the event would be raised on the background thread. 
        // While WebClient can raise an event on the UI thread if called from the UI thread, a best practice is to always 
        // use the Dispatcher to update the UI. This keeps the UI thread free from heavy processing.
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            // Bind the list of SyndicationItems to our ListBox.
            feedListBox.ItemsSource = feed.Items;
    
            loadFeedButton.Content = "Refresh Feed";
        });
    }
    
    // The SelectionChanged handler for the feed items 
    private void feedListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListBox listBox = sender as ListBox;
    
        if (listBox != null && listBox.SelectedItem != null)
        {
            // Get the SyndicationItem that was tapped.
            SyndicationItem sItem = (SyndicationItem)listBox.SelectedItem;
    
            // Set up the page navigation only if a link actually exists in the feed item.
            if (sItem.Links.Count > 0)
            {
                // Get the associated URI of the feed item.
                Uri uri = sItem.Links.FirstOrDefault().Uri;
    
                // Create a new WebBrowserTask Launcher to navigate to the feed item. 
                // An alternative solution would be to use a WebBrowser control, but WebBrowserTask is simpler to use. 
                WebBrowserTask webBrowserTask = new WebBrowserTask();
                webBrowserTask.Uri = uri;
                webBrowserTask.Show();
            }
        }
    }
    
    

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft