locked
affichage image d'un flux rss System.ServiceModel.Syndication RRS feed

  • Question

  • Bonjour a toutes et a tous,

    Je travaille sur une app wp7, mode panorama, qui affiche divers flux rss.

    J'utilise   System.serviceModel.Syndication.

    Je découvre un peut l'affichage d'un flux rss dans une app sur ce coup la et j'aimerais profiter de vos lumières pour pouvoir afficher sur chaque flux les images associer a chaque news afficher.

    Bon, vu que le code vaut mieux qu'un long discourt, voila mon travail pour le moment (pas taper):

    Le MainPage.Xaml.cs

    namespace monapp
    {
        
        public partial class MainPage : PhoneApplicationPage, INotifyPropertyChanged
        {
            private IEnumerable<Flux> listeDeFlux;
            public IEnumerable<Flux> ListeDeFlux
            {
                get
                {
                    return listeDeFlux;
                }
                set
                {
                    if (value == listeDeFlux)
                        return;
                    listeDeFlux = value;
                    NotifyPropertyChanged("ListeDeFlux");
                }
            }
    
            
            public event PropertyChangedEventHandler PropertyChanged;
    
            public void NotifyPropertyChanged(string nomPropriete)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
            }
    
            private WebClient client;
            private List<SyndicationFeed> listeFlux;
            private string[,] Mes_Flux = new string[4, 2];
            private int index,NB_Flux;
    
    
            // Constructeur
            public MainPage()
            {
                
                InitializeComponent();
                Mes_Flux[0, 0] = "flux n°1";
                Mes_Flux[0, 1] = "http://www.fluxrss1.xml";
                Mes_Flux[1, 0] = "flux n°2";
                Mes_Flux[1, 1] = "http://fluxrss2.xml";
                Mes_Flux[2, 0] = "flux n°3";
                Mes_Flux[2, 1] = "http://fluxrss3.xml";
                Mes_Flux[3, 0] = "flux n°4";
                Mes_Flux[3, 1] = "http://fluxrss4.xml";
                index = 0;
                NB_Flux = 4;
                listeFlux = new List<SyndicationFeed>();
                client = new WebClient();
                client.DownloadStringCompleted += client_DownloadStringCompleted;
                client.DownloadStringAsync(new Uri(Mes_Flux[index, 1]), Mes_Flux[index, 0]);
                DataContext = this;
                        }
            
            private void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
                    {
                if (e.Error != null) return;
                {
                    
                    AjouteFlux(e.Result);
                    index++;
                    if (index<NB_Flux )
    
                    {
                        // lancer le téléchargement suivant
                        client.DownloadStringAsync(new Uri(Mes_Flux[index, 1]), Mes_Flux[index, 0]);
                    }
                    else ListeDeFlux = CreerLeFlux(listeFlux);
                    
                }
            }
       
            private IEnumerable<Flux> CreerLeFlux(List<SyndicationFeed> liste)
            {
                int n = 0;
                foreach (SyndicationFeed flux in liste)
                {
                    Flux f = new Flux
                    {
                        Titre = Mes_Flux[n, 0], //flux.Title.Text,
                        Elements = CreerElements(flux.Items)
                        
                    };
                    yield return f;
                    n++;
                }
            }
           
            private IEnumerable<Elements> CreerElements(IEnumerable<SyndicationItem> elements)
            {
                foreach (SyndicationItem element in elements)
                {
                    SyndicationLink lien = element.Links.FirstOrDefault();
    
                    Elements e = new Elements
                    {
                        Titre = element.Title.Text,
                        Url = lien == null ? null : lien.Uri,
               
                    };
                    yield return e;
                }
            }
    
    
            private void AjouteFlux(string flux)
            {
                StringReader stringReader = new StringReader(flux);
                XmlReader xmlReader = XmlReader.Create(stringReader);
                SyndicationFeed feed = SyndicationFeed.Load(xmlReader);
                listeFlux.Add(feed);
            }
    
            private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                ListBox listBox = sender as ListBox;
    
                if (listBox != null && listBox.SelectedItem != null)
                {
                    Elements elementChoisi = (Elements)listBox.SelectedItem;
                    if (elementChoisi.Url != null)
                    {
                        WebBrowserTask webBrowserTask = new WebBrowserTask();
                        webBrowserTask.Uri = elementChoisi.Url;
                        listBox.SelectedItem = null;
                        webBrowserTask.Show();
                    }
                }
              }
    
            }
        }

    Flux.cs:

    namespace monapp
    {
        public class Flux
        {
            public string Titre { get; set; }
            public IEnumerable<Elements> Elements { get; set; }
        }
    }
    


    Elements.cs

    namespace monapp
    {
        public class Elements
        {
            public string Titre { get; set; }
            public Uri Image { get; set; }
            public Uri Url { get; set; }
            }
    }

    Et le MainPage.xaml:

    <!--LayoutRoot est la grille racine où tout le contenu de la page est placé-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
             <!--Contrôle Panorama-->
            <controls:Panorama ItemsSource="{Binding ListeDeFlux}" Title="mon app">
                <controls:Panorama.Background>
                    <ImageBrush ImageSource="PanoramaBackground.png"/>
                </controls:Panorama.Background>
     
                <!--Élément un de panorama-->
                <controls:Panorama.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Titre}" FontSize="48" FontWeight="Bold" />
                    </DataTemplate>
                    </controls:Panorama.HeaderTemplate>
                <controls:Panorama.ItemTemplate>
                    <!--Liste double trait avec habillage du texte-->
                    <DataTemplate>
                        <ListBox ItemsSource="{Binding Elements}" SelectionChanged="ListBox_SelectionChanged">
                            <ListBox.ItemTemplate>
                            <DataTemplate>
                                    <TextBlock Text="{Binding Titre}" TextWrapping="Wrap" Margin="0 20 0 0" FontSize="24" FontWeight="Bold"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                        </DataTemplate>
                </controls:Panorama.ItemTemplate>
                      </controls:Panorama>
            
        </Grid>
    </phone:PhoneApplicationPage>

    Voila le boulot :)

    Ca fonctionne impec, je peut rajouter des flux dans le tableau et ca rajoute le flux sans soucis dans le mode panorama.

    Mais je rame vraiment pour pouvoir inserer les images des flux.

    Merci infiniment de votre aide :)

    Patrice

    vendredi 16 novembre 2012 10:16

Réponses

  • Salut !

    Voilà une solution que j'ai faite pour afficher des images qui sont mises dans le descriptif d'un flux : 

     public static string GetImage(string source)
            {
                string matchString = Regex.Match(source, @"(?<=<img.*?src=\"")[^\""]*(?=\"".*?((/>)|(>.*</img)))").Value;
                return matchString;
            }

    Renseigne ton Elements comme cela (Moi Elements.Image est un string)

    Elements.Image = GetImage(value.Element("description").Value); 

    Coté XAML :

    <Image Source="{Binding Path=Image}" />

     

    Christophe

    • Marqué comme réponse pbaranx vendredi 16 novembre 2012 19:10
    vendredi 16 novembre 2012 14:52

Toutes les réponses

  • Salut !

    Voilà une solution que j'ai faite pour afficher des images qui sont mises dans le descriptif d'un flux : 

     public static string GetImage(string source)
            {
                string matchString = Regex.Match(source, @"(?<=<img.*?src=\"")[^\""]*(?=\"".*?((/>)|(>.*</img)))").Value;
                return matchString;
            }

    Renseigne ton Elements comme cela (Moi Elements.Image est un string)

    Elements.Image = GetImage(value.Element("description").Value); 

    Coté XAML :

    <Image Source="{Binding Path=Image}" />

     

    Christophe

    • Marqué comme réponse pbaranx vendredi 16 novembre 2012 19:10
    vendredi 16 novembre 2012 14:52
  • merci Christophe, ca m'as bien aider a regler le soucis :)

    Bon week end

    Patrice

    vendredi 16 novembre 2012 19:10