Bester Ansatz zur Entwicklung der WPF-Anwendung [geschlossen]

9

Ich möchte eine WPF-Anwendung erstellen und möchte Sie zu dem am besten geeigneten Ansatz beraten.

Ich möchte einen RSS-Reader erstellen, der automatisch aktualisiert wird, wenn ein neuer RSS-Eintrag hinzugefügt wird. Das Problem ist, dass ich keine traditionellen Steuerelemente (Listbox / Listview) verwenden möchte, um die Daten anzuzeigen. Ich möchte, dass die Feedelemente in zufälliger Reihenfolge auf dem Bildschirm angezeigt werden. Diese Panels bestehen aus mehreren Textblöcken. In jedem Bereich wird ein Feedelement angezeigt.

Es würde ungefähr so ​​aussehen: Konzept

Dies wirft mehrere Fragen auf:

1: Generieren Sie Panels vollständig aus Code oder verwenden Sie ein benutzerdefiniertes Steuerelement?

Ich würde eine Klasse wie ein Panel modellieren, wie oben beschrieben. Diese Klasse fügt dem Formular manuell alle Steuerelemente hinzu und löscht das Panel an einer zufälligen Position im Formular. Wenn ein neuer RSS-Eintrag hinzugefügt wird, wird eine Instanz dieser Klasse instanziiert und übergibt die rss-Information als Parameter.

Auf der anderen Seite könnte es besser sein, dafür ein UserControl zu erstellen. Ist es einfach, dieses UserControl per Code zu erstellen und die Parameter im Konstruktor zu übergeben?

2: Können meine Daten / Panel automatisch aktualisiert werden, wenn ein neuer RSS-Eintrag online hinzugefügt wurde?

Im Moment würde ich alles jeweils (x) Sekunden auffrischen und gegen eine Sammlung von Panels prüfen, wenn dort ein neues erstellt werden muss. Wenn dies der Fall ist, erstellen Sie ein neues Fenster und legen Sie es zufällig auf dem Formular ab.

Gibt es einen besseren Weg, dies zu tun? Ich kann eine lokale ObservableCollection mit Datenbindung verwenden, die ein Steuerelement (Listbox usw.) automatisch aktualisiert, wenn sich die Sammlung ändert. Kann dies auch mit einer Online-Quelle wie einem RSS-Feed geschehen?

Der idealste Weg wäre, dass meine Anwendung benachrichtigt wird, wenn ein neuer RSS-Eintrag hinzugefügt wurde, den letzten Eintrag herunterlädt und ein neues Panel erstellt (durch Code oder durch ein UserControl)

Wenn das schwer zu bewerkstelligen ist, verwende ich die traditionelle Aktualisierungsmethode.

3: Muss ich DependencyObject / DependencyProperty verwenden?

Ich weiß DependencyObject & amp; DependencyProperty stellt einige leistungsstarke Funktionen für UserControls zur Verfügung, aber ich weiß nicht, wie ich sie benutzen soll. Sind sie für diese Art der Anwendung notwendig?

4: Muss ich WCF (Windows Communication Foundation) verwenden?

Ich bin nicht wirklich erfahren mit "fortgeschrittenen" WPF-Sachen wie fortgeschrittenen Datenbindungen, DependencyObjects und UserControls, aber ich liebe es zu lernen!

    
Nick 08.07.2011, 17:46
quelle

4 Antworten

2

Ich würde empfehlen, zunächst das MVVM-Designmuster zu verwenden und ein MVVM-Framework zu verwenden. Zweitens können Sie diesen Effekt mit einem ItemsControl erzielen und einen Canvas als ItemsPanel-Typ verwenden. Dann können Sie ein benutzerdefiniertes ItemTemplate verwenden, das jedes Datenobjekt mit einem UserControl rendert.

Das Benutzersteuerelement hätte eine Abhängigkeitseigenschaft, die das Datenelement darstellt, und Sie würden dies in der Elementvorlageerklärung binden.

Sie könnten ein Modell haben, das jeden RSS-Eintrag (RSSEntry) modelliert, und vielleicht ein RSSEntryViewModel, das die x- und y-Koordinaten auf der Zeichenfläche hinzufügt.

Ihr Bildschirmmodell würde dann eine ObservableCollection von RSSViewModel haben, die Sie hinzufügen / löschen usw., und die Benutzeroberfläche würde automatisch aktualisiert.

Sie würden keinen Service-Layer benötigen, wenn Sie nicht möchten, aber solange Ihr View-Modell die Einträge über eine Abstraktion abruft, sollte es in der Zukunft leicht umstrukturiert werden können.

    
devdigital 08.07.2011 18:07
quelle
2
  1. Generieren Sie Panels vollständig aus Code oder verwenden Sie ein benutzerdefiniertes Steuerelement? Normalerweise versuche ich in XAML deklarativ so viel wie möglich zu tun. Die Trennung von Logik und Präsentation hilft normalerweise bei der Skalierbarkeit der Anwendung und Code-Qualität - aber natürlich gibt es Grenzen. UserControl s sollen normalerweise keine Parameter in ihren Konstruktoren haben (nicht dass sie diese nicht haben können, aber Sie müssen einen parameterlosen Konstruktor haben, damit die Klasse von XAML instanziiert werden kann).

  2. Können meine Daten / Panel automatisch aktualisiert werden, wenn ein neuer RSS-Eintrag online hinzugefügt wurde? Es muss etwas vorhanden sein, um Update-Benachrichtigungen an die WPF-Ebene zu senden, damit die Anzeige aktualisiert werden kann . Im Falle einer RSS-Anwendung müssen Sie die RSS-Kanäle manuell nach Updates scannen (RSS ist eine Technologie zum Ziehen ) und im Falle einer Aktualisierung fügen Sie den Artikel in ObservableCollection ein, der die entsprechende Update-Benachrichtigung für Sie sendet.

  3. Muss ich DependencyObject / DependencyProperty verwenden? Nein, Sie können INotifyPropertyChanged . DependencyProperties werden im Allgemeinen in Eigenschaften verwendet, die als bindendes Ziel dienen (die Eigenschaft, die die Bindung deklariert) oder in Eigenschaften, die andere DP-Feature-Value-Vererbung oder -Animation nutzen. INotifyPropertyChanged ist genug für die Eigenschaften, an die gebunden ist (die im Bindungsausdruck genannt werden). Beachten Sie, dass Sie NotifyPropertyWeaver verwenden können, um die Benachrichtigungen für INotifyPropertyChanged automatisch zu generieren - Sie erstellen einfach die OnPropetyChanged-Methode, die der Weber dann aufruft es immer wenn eine Eigenschaft des Objekts geändert wird! Und es lässt sich sogar wunderbar mit Visual Studio integrieren.

  4. Muss ich WCF (Windows Communication Foundation) verwenden? Für WCF muss man etwas haben, mit dem man kommunizieren kann - es ist immerhin ein Kommunikationsframework. Machst du?

Matěj Zábský 08.07.2011 18:12
quelle
1
  1. Sie sollten eine WPF-Listenansicht (oder ähnlich; nicht sicher, welche Kontrolle genau) verwenden, und theme it , um Ihre gewünschte "Panel" Idee zu erfüllen. Das ist eine der großen Stärken von WPF. Dann erhalten Sie alle Vorteile der integrierten Steuerung mit jedem gewünschten Aussehen.

  2. Bindung an die ObservableCollection ; Wie Sie diese beobachtbare Sammlung aktualisieren, ist Ihre Aufgabe. Ich glaube nicht, dass RSS einen "Push Notifications" Teil seiner Spezifikation hat, also ist Polling, wie diese Dinge normalerweise gemacht werden. Aber letztendlich ist es nicht wirklich wichtig; Dieser Teil Ihres Codes ist vollständig von WPF getrennt, so lange es die ObservableCollection aktualisiert, sind Sie gut.

  3. Entweder DependencyObject / DependencyProperty oder INotifyPropertyChanged sind im Allgemeinen für jede Art von WPF-Anwendung mit Databinding erforderlich. Es lohnt sich, sie zu lernen und dann vielleicht einen Rahmen zu lernen, der sie für dich abstrahiert.

  4. Nein; WCF hat nichts mit WPF zu tun. Sie können jede Technologie verwenden, um mit dem Server zu sprechen, den Sie mögen.

Domenic 08.07.2011 18:05
quelle
0
  

1: Generieren Sie Felder vollständig aus dem Code oder verwenden Sie ein benutzerdefiniertes Steuerelement?

Erstellen Sie zwei Ansichtsmodellklassen. Eine Klasse modelliert die Ansicht aller Ihrer Elemente und eine Klasse den Inhalt eines einzelnen Elements. Ersteres wird eine beobachtbare Sammlung des letzteren enthalten.

Erstellen Sie ein Benutzersteuerelement, um jedes anzuzeigen.

Die Containeransicht ist ein ItemsControl , dessen ItemsSource an seine Sammlung von Artikelansichtsmodellen gebunden ist, deren ItemsPanel ein Canvas ist und deren ItemContainerStyle die Eigenschaften Canvas.Top und Canvas.Left bindet zu den Eigenschaften Top und Left in den Modellen der Artikelansicht. Wenn der Sammlung des Ansichtsmodells ein neues Element hinzugefügt wird, wird durch die Bindung automatisch ein neues Element dafür erstellt.

Die Artikelansichtsmodelle generieren die Zufallswerte von Top und Left selbst. (Sie können auch festlegen, dass die Werte vom Container angefordert werden, wenn sie erstellt werden.)

(Wenn der Begriff "Ansichtsmodell" Ihnen nichts bedeutet, müssen Sie das Modell / Ansicht / Ansicht Modellmuster, auch MVVM genannt, erforschen.)

  

2: Können meine Daten / Panel automatisch aktualisiert werden, wenn ein neuer RSS-Eintrag online hinzugefügt wurde?

Zunächst müssen Sie recherchieren, wie RSS-Aggregatoren funktionieren, da Sie eine schreiben. Das erklärt Ihnen, wie Sie Updates von RSS-Feeds erhalten. Dieses Problem unterscheidet sich vollständig von dem Problem, die Updates zu präsentieren, sobald Sie sie erhalten haben.

Ihre RSS-Aggregationsschicht prüft die Feeds, sucht nach neuen Elementen und löst beim Auffinden neuer Elemente ein Ereignis aus. Ihre UI-Schicht behandelt Ereignisse, die von der Aggregationsschicht ausgelöst werden, und erstellt neue Ansichtsmodellobjekte für jedes neue empfangene Element.

Diese Verwendung von Ereignissen entkoppelt die beiden Komponenten vollständig voneinander. Sie können Ihre Benutzeroberfläche z. B. testen, indem Sie einen Scheinaggregator erstellen, der Testnachrichten generiert und Ihre Benutzeroberfläche anstelle Ihres echten Aggregators abgehört. In ähnlicher Weise können Sie Ihren Aggregator testen, ohne ihn zu erstellen. Sie können einfach einen Listener erstellen, der sich für seine Ereignisse registriert und Elemente an die Konsole ablegt.

  

3: Muss ich DependencyObject / DependencyProperty verwenden?

Sie müssen wahrscheinlich nicht Ihre eigenen implementieren, nein.

  

4: Muss ich WCF (Windows Communication Foundation) verwenden?

Warum sollten Sie nicht?

    
Robert Rossney 08.07.2011 18:08
quelle

Tags und Links