Entwickler-Ecke

WPF / Silverlight - c# Rssreader


martinklaus - So 31.08.14 11:35
Titel: c# Rssreader
Hallo

ich bin ganz neu und das ist meine erste Windows 8 app.
Ich ha probleme mit dem List.First() methode.

Die Basis ist eine Windows 8 Raster app.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
using DotnetBlogApp.Common;
using DotnetBlogApp.Data;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// Die Elementvorlage für die Seite "Gruppierte Elemente" ist unter http://go.microsoft.com/fwlink/?LinkId=234231 dokumentiert.

namespace DotnetBlogApp
{
    /// <summary>
    /// Eine Seite, auf der eine gruppierte Auflistung von Elementen angezeigt wird.
    /// </summary>
    public sealed partial class GroupedItemsPage : Page
    {
        private NavigationHelper navigationHelper;
        private ObservableDictionary defaultViewModel = new ObservableDictionary();

        /// <summary>
        /// NavigationHelper wird auf jeder Seite zur Unterstützung bei der Navigation verwendet und 
        /// Verwaltung der Prozesslebensdauer
        /// </summary>
        public NavigationHelper NavigationHelper
        {
            get { return this.navigationHelper; }
        }

        /// <summary>
        /// Dies kann in ein stark typisiertes Anzeigemodell geändert werden.
        /// </summary>
        public ObservableDictionary DefaultViewModel
        {
            get { return this.defaultViewModel; }
        }

        public GroupedItemsPage()
        {
            this.InitializeComponent();
            this.navigationHelper = new NavigationHelper(this);
            this.navigationHelper.LoadState += navigationHelper_LoadState;
        }

        /// <summary>
        /// Füllt die Seite mit Inhalt auf, der bei der Navigation übergeben wird.  Gespeicherte Zustände werden ebenfalls
        /// bereitgestellt, wenn eine Seite aus einer vorherigen Sitzung neu erstellt wird.
        /// </summary>
        /// <param name="sender">
        /// Die Quelle des Ereignisses, normalerweise <see cref="NavigationHelper"/>
        /// </param>
        /// <param name="e">Ereignisdaten, die die Navigationsparameter bereitstellen, die an
        /// <see cref="Frame.Navigate(Type, Object)"/> als diese Seite ursprünglich angefordert wurde und
        /// ein Wörterbuch des Zustands, der von dieser Seite während einer früheren
        /// beibehalten wurde.  Der Zustand ist beim ersten Aufrufen einer Seite NULL.</param>
        private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
        {

            // TODO: Ein geeignetes Datenmodell für die problematische Domäne erstellen, um die Beispieldaten auszutauschen
            //var sampleDataGroups = await SampleDataSource.GetGroupsAsync();
            //this.DefaultViewModel["Groups"] = sampleDataGroups;

            BlogFeedProxy blogFeedProxy = new BlogFeedProxy();
            var feeds = await blogFeedProxy.LoadFeedsAsync();

            this.DefaultViewModel["Groups"] = feeds;
        }

        /// <summary>
        /// Wird aufgerufen, wenn auf einen Gruppenkopf geklickt wird.
        /// </summary>
        /// <param name="sender">Die Schaltfläche, die als Gruppenkopf für die ausgewählte Gruppe verwendet wird.</param>
        /// <param name="e">Ereignisdaten, die beschreiben, wie der Klick initiiert wurde.</param>
        void Header_Click(object sender, RoutedEventArgs e)
        {
            // Ermitteln, welche Gruppe die Schaltflächeninstanz darstellt
            var group = (sender as FrameworkElement).DataContext;

            // Zur entsprechenden Zielseite navigieren und die neue Seite konfigurieren,
            // indem die erforderlichen Informationen als Navigationsparameter übergeben werden
            this.Frame.Navigate(typeof(GroupDetailPage), ((SampleDataGroup)group).UniqueId);
        }

        /// <summary>
        /// Wird aufgerufen, wenn auf ein Element innerhalb einer Gruppe geklickt wird.
        /// </summary>
        /// <param name="sender">GridView (oder ListView, wenn die Anwendung angedockt ist),
        /// die das angeklickte Element anzeigt.</param>
        /// <param name="e">Ereignisdaten, die das angeklickte Element beschreiben.</param>
        void ItemView_ItemClick(object sender, ItemClickEventArgs e)
        {
            // Zur entsprechenden Zielseite navigieren und die neue Seite konfigurieren,
            // indem die erforderlichen Informationen als Navigationsparameter übergeben werden
            var itemId = ((SampleDataItem)e.ClickedItem).UniqueId;
            this.Frame.Navigate(typeof(ItemDetailPage), itemId);
        }

        #region NavigationHelper-Registrierung

        /// Die in diesem Abschnitt bereitgestellten Methoden werden einfach verwendet, um
        /// damit NavigationHelper auf die Navigationsmethoden der Seite reagieren kann.
        /// 
        /// Platzieren Sie seitenspezifische Logik in Ereignishandlern für  
        /// <see cref="GridCS.Common.NavigationHelper.LoadState"/>
        /// und <see cref="GridCS.Common.NavigationHelper.SaveState"/>.
        /// Der Navigationsparameter ist in der LoadState-Methode verfügbar 
        /// zusätzlich zum Seitenzustand, der während einer früheren Sitzung beibehalten wurde.

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            navigationHelper.OnNavigatedTo(e);
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            navigationHelper.OnNavigatedFrom(e);
        }

        #endregion

        public object feeds { get; set; }
    }
}




C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DotnetBlogApp.Data;
using Windows.Web.Syndication;
using DotnetBlogApp.Common;

namespace DotnetBlogApp
{
    public class BlogFeedProxy
    {
        public async Task<IEnumerable<SampleDataGroup>> LoadFeedsAsync()
        {
            SyndicationClient client = new SyndicationClient();
            SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri("http://webenliven-space.de/dotnetblog/syndication.axd"));

            SampleDataGroup group = new SampleDataGroup("OnlyGroup""Posts""Posts""Assets/DarkGray.png", feed.Subtitle.Text);

            foreach (var item in feed.Items)
            {
                var images = item.Summary.Text.GetImageSources();

                SampleDataItem sampleDataItem = new SampleDataItem(item.Id,
                    item.Title.Text,
                    string.Empty,
                    images.First(),
                    item.Summary.Text,
                    item.Summary.Text,
                    group);

                group.Items.Add(sampleDataItem);
            }

            List<SampleDataGroup> groups = new List<SampleDataGroup>();
            groups.Add(group);

            return groups;
        }
    }
}


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace DotnetBlogApp.Common
{
    public static class StringContentHelper
    {
        public static List<string> GetImageSources(this string htmlContent)
        {
            Regex regex = new Regex("<img\\s[^>]*?src=[\"']([^\"']+)[\"'][^>]*>", RegexOptions.IgnoreCase);
            MatchCollection matches = regex.Matches(htmlContent);

            List<string> sources = new List<string>();

            foreach (Match item in matches)
            {
                sources.Add(item.Groups[1].Value);
            }

            return sources;
        }
    }
}



Moderiert von user profile iconTh69: Topic aus WinForms verschoben am So 31.08.2014 um 13:49


Christian S. - So 31.08.14 11:38

user profile iconmartinklaus hat folgendes geschrieben Zum zitierten Posting springen:
Ich ha probleme mit dem List.First() methode.
Und welches?


martinklaus - So 31.08.14 12:50

images.First() geht nicht.
Die Methode soll aus dem rss feed das erste Bild suchen und dies wird dan als Kachel Bild genommen
Obwohl beim deugen für mich raus kam das die liste sinnvoll gefühlt wird


Ralf Jansen - So 31.08.14 13:05

Jetzt noch die Fehlermeldung und wir sind bald soweit das man auch helfen kann.


martinklaus - So 31.08.14 13:13

invalidoperationexception wurde nicht von benutzercode behandelt.

Zeile 72 var feeds = await blogFeedProxy.LoadFeedsAsync();

hab auch noch das gefunden
- $exception {"Sequence contains no elements"} System.Exception {System.InvalidOperationException}

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - So 31.08.14 13:16

Das bekommst du wenn images leer ist.
Falls das ein gültiger Zustand ist benutzt FirstOrDefault anstatt First.


martinklaus - So 31.08.14 13:20

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Das bekommst du wenn images leer ist.
Falls das ein gültiger Zustand ist benutzt FirstOrDefault anstatt First.



ok nice es kompiliert aber leider sind die Kacheln leer


martinklaus - So 31.08.14 13:27

Ok das 1 Problem war das 3 Feeds keine Bilder haben und er durch First immer ein Bild wollte für jeden feed
In Moment geht es aber nur mit den 1 Konstruktor nicht mit den 2 wie es soll.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public SampleDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content)
        {
            this.UniqueId = uniqueId;
            this.Title = title;
            this.Subtitle = subtitle;
            this.Description = description;
            this.ImagePath = imagePath;
            this.Content = content;
        }

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        public SampleDataItem(string p1, string p2, string p3, string p4, string p5, string p6, SampleDataGroup group)
        {
            // TODO: Complete member initialization
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
            this.p4 = p4;
            this.p5 = p5;
            this.p6 = p6;
            this.group = group;
        }


Th69 - So 31.08.14 13:59

Hallo und :welcome: (da dies bisher keiner vorher getan hat ;-)),

dein 2. Konstruktor sieht mir doch sehr nach einem vom Visual Studio automatisch generierten aus, zumindestens die erste Zeile davon.

Möchtest du einfach einen weiteren Parameter haben?

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public SampleDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content, SampleDataGroup group)
{
    this.UniqueId = uniqueId;
    this.Title = title;
    this.Subtitle = subtitle;
    this.Description = description;
    this.ImagePath = imagePath;
    this.Content = content;
    this.Group = group;
}

Du mußt dann aber auch eine Eigenschaft Group dafür anlegen.

PS: Bitte drücke dich demnächst ein bißchen gezielter aus - mein erster Eindruck auf deinen Beitrag war: "Was willst du uns mitteilen?".