VS 2010 Windows Phone - Czytnik RSS - wyświetlanie autora

0

[VS 2010 Windows Phone] Czytnik RSS -

Witam. Robię czytnik RSS. Kod w całości nie jest mojego autorstwa, tylko z różnych źródeł ale działa elegancko. Chciałem dopisać do kodu żeby oprócz tytułu, treści i daty z godziną danego artykułu pokazywało również autora i nie wiem za bardzo jak to zrobić. Kod w całości nie jest mojego autorstwa, tylko z różnych źródeł ale działa elegancko.

using System;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using System.IO;
using System.ServiceModel.Syndication;
using System.Xml;
using Microsoft.Phone.Tasks;
using System.Windows.Data;

namespace WindowsMania.pl
{
    public partial class posty : PhoneApplicationPage
    {
        public posty()
        {
            InitializeComponent();
        }
        private void loadFeedButton_Click(object sender, System.Windows.RoutedEventArgs e)
        {   
            WebClient webClient = new WebClient();
            webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
            webClient.DownloadStringAsync(new System.Uri("http://feeds.feedburner.com/windowsmania/noweposty?format=xml"));
        }
        private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {   
                    MessageBox.Show("Próba wczytania danych zakończona niepowodzeniem, sprawdź połączenie z siecią.");
                });
            }
            else
            {
                this.State["feed"] = e.Result;
                UpdateFeedList(e.Result);
            }
        }
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            
            if (this.State.ContainsKey("feed"))
            {
                
                if (feedListBox.Items.Count == 0)
                {
                    UpdateFeedList(State["feed"] as string);
                }
            }
        }

        private void UpdateFeedList(string feedXML)
        {
           
            StringReader stringReader = new StringReader(feedXML);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            SyndicationFeed feed = SyndicationFeed.Load(xmlReader);
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                
                feedListBox.ItemsSource = feed.Items;

                loadFeedButton.Content = "Odśwież";
            });

        }    
        private void feedListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListBox listBox = sender as ListBox;

            if (listBox != null && listBox.SelectedItem != null)
            {
                
                SyndicationItem sItem = (SyndicationItem)listBox.SelectedItem;
                if (sItem.Links.Count > 0)
                {
                    
                    Uri uri = sItem.Links.FirstOrDefault().Uri;
                    WebBrowserTask webBrowserTask = new WebBrowserTask();
                    webBrowserTask.Uri = uri;
                    webBrowserTask.Show();
                }

            }
        }
    }
} 
0

Taaa z różnych źródeł... :D
https://github.com/XenGi/xda-news/blob/master/xda-news/MainPage.xaml.cs

A co do Twojego autora to go od tak nie dodasz ponieważ uwaga ten rss http://feeds.feedburner.com/windowsmania/noweposty?format=xml go nie udostępnia. :D

0
DibbyDum napisał(a):

Taaa z różnych źródeł... :D
https://github.com/XenGi/xda-news/blob/master/xda-news/MainPage.xaml.cs

Ja mam akurat z całkowicie innego źródła!!!

Widzę że słabi fachowcy udzielają tutaj pomocy. Wystarczyło sprawdzić kod źródłowy strony żeby zobaczyć że autor jest w treści i jest udostępniany. A to że nie jest on pokazywany to inna sprawa!!!
Tak więc dziękuję za taką pomoc i proszę kogoś bardziej kompetentnego!

0

Tak czy siak zero inwencji twórczej. Ściągłeś gotowe wstawiłeś na forum wciskając kit że coś się wysiliłeś a teraz czekasz aż ktoś za Ciebie to dokończy. Noto szukaj dalej chętnych fachowców. Powodzenia. :)

0

A może nie tyle zero inwencji twórczej co brak wystarczającej znajomości c#, co nie znaczy że mam dać sobie z tym spokój bo jeżeli można było znaleźć to to znaczy że ktoś udostępnił i raczej dla takich laików jak ja. To jeżeli ktoś dał tyle to czemu ktoś inny nie ma pomóc dalej!?
Chyba po to są fora - żeby pomagać!

1

Spokojnie, spokojnie.

Faktycznie RSS udostępnia autora, jako <dc:creator>. W tym kodzie podwiązujesz sobie dane z RSS do feedsListBox. W kodzie XAML masz - jeśli faktycznie korzystasz z tamtego przykładu - coś w stylu szablonu wyświetlania pojedynczego newsa:

<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>

Problem polega na tym, że żeby dostać się do <dc:creator> trzeba użyć na elemencie kolekcji metody ElementExtensions.ReadElementExtensions(). Nie da się jednak tego zrobić w samym XAML-u, trzeba sobie napisać konwerter. Tutaj jest cała trudność.

Stwórz nową klasę:

public class DcCreatorConverter: IValueConverter
    {

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

            var x = ((System.ServiceModel.Syndication.SyndicationItem)value).ElementExtensions.ReadElementExtensions<string>("creator", "http://purl.org/dc/elements/1.1/")[0];
            
            return x;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Dostaje ona obiekt klasy System.ServiceModel.Syndication.SyndicationItem i wyodrębnia z niego element dc:creator (dc to XML-owa przestrzeń nazw związana z tym URI co tam jest podany) i zwraca string.

Potem dodaj sobie do szablonu wyświetlania newsa kolejnego TextBlocka:

<TextBlock Text="{Binding Converter={StaticResource DcCreatorConverter}}"></TextBlock>

On binduje cały element (dlatego samo Binding, a nie Binding coś), korzystając z konwertera DcCreatorConverter. Wypadałoby potem ten tekst ostylować, ale mniejsza o to. Tutaj będzie się wyświetlać nazwa użytkownika który dodał post.

Żeby móc użyć konwertera, który jest jak widzisz jako StaticResource, wypadało by go dodać do Resources aplikacji. W tym celu w pliku App.xaml w sekcji <Application.Resources> dodaj nowy wpis:

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

I gotowe.

Rzeczy które mi pomogły w napisaniu tego:
http://stackoverflow.com/questions/2562120/how-to-read-dccreator-element-from-an-rss-feed-using-system-servicemodel-synd
http://wpftutorial.net/ValueConverters.html

W załączniku masz gotowy projekt wyświetlający autorów.

0

Dzięki bardzo za pomoc! Działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1