Wie arbeite ich mit Bildern in einem portable Klassenbibliothek für Windows Store-Apps und WP7,WP8,WPF?
Arbeite ich an einem ersten PCL, dass die Ziele : WSA (Windows Store-Anwendung), WPF,WP7,WP8. Wir können sagen, dass es ein rolerdex Art von Anwendung, die Sie Kontakte , Sie haben die Kontaktdaten und Bilder. (ist es nicht, aber ich kann nicht geben details über die Anwendung, so bin ich mit einem sehr einfachen Beispiel statt). Hier sind einige meiner Fragen 🙂
- Sollte ich habe die Bilder in der PCL?
Wenn ja:
- Wie Referenz-Bild für die Verwendung in der WSA?
- Wie kann ich am besten lösen Skalierung mit dem Maßstab Qualifier etc. wenn verwendet, über verschiedene Projekte hinweg?
Ich bin nicht mit einer Datenbank und die Bilder werden nicht heruntergeladen, von einem externen service - ich möchte die Bilder (nicht wirklich viele), die lokal in der app oder in der PCL.
BEARBEITEN:
Ich will einfach nur, um die Bilder anzuzeigen. Das ist es. Es ist ein statisches rolerdex, können keine neuen Menschen. Ich möchte nur anzeigen 5 Anzahl der Menschen und Ihr Bild (in der PCL). Wie kann ich mich auf die Bilder wenn es eine Windows Store-Anwendung?
Ich haben eine Bindung und die DataContext gesetzt ist, um ein ViewModel in der PCL. Die ViewModel-Aggregate die Daten angezeigt werden, die aus den Modellen. Die Eigenschaft, die ich gebunden habe gegen MyImage. Ignoriert die anderen Plattformen, wie würde der Uri Aussehen? Alles andere funktioniert einwandfrei.
Ich soll wirklich nur helfen, mit diesen drei Fragen, obwohl ich wirklich zu schätzen alle die Antworten!!!
- Was ist die WSA? Windows S? Ein?
- Es ist nur ein schlechter Versuch att shortning die verflixt langen Namen Windows Store-Anwendung. Ich habe dafür gesorgt, dass es so in den Q jetzt 🙂
- Ich denke, das problem könnte werden das Wort "Referenz" - wenn du meinst Uri? Dann nehmen Sie einen Blick an etwas wie stackoverflow.com/questions/10511946/... ?
- Das Uri-Schema funktioniert nicht mit der PCL -, aber vielleicht etwas ähnliches? Gleichzeitig weiß ich ehrlich gesagt nicht, ob es möglich ist. Ich habe gegoogelt für einen Tag jetzt und habe versucht, ein Dutzend Variationen. Ich hatte gehofft, dass jemand wusste sicher :/
- Aus meiner Antwort... in "die PCL-control-code wird in der Lage sein, zu behandeln jede Datei nur ein paar strings - Ordner es ist in der und der Datei-name" - zusammen bilden Sie eine "Adresse" für Ihre Bild - danach "eine bestimmte ValueConverter zu generieren, die den korrekten Dateinamen oder filestream auf jeder Plattform"
- Meine Frage bleibt trotzdem die gleiche : / wie würde der Uri Aussehen? Ich fühle mich ziemlich dumm an dieser Stelle, wenn jemand erklärt mir, wie ein Pfad aussieht (oder ich bin Missverständnis Ihren Kommentar?)
- Man könnte Sie als Iris-Uri - "iris://Ordner/Dateiname" - offensichtlich-Wandler brauchen würde, um eine Karte zu "isostorage", zu "ms-appdata" etc?
- Haben Sie in der Lage zu machen, dass die Arbeit mit einem PCL-und WinRT-app? Ich habe versucht, ganz wenige Versionen, den ganzen Tag mit kein Glück, aber vielleicht habe ich etwas verpasst. Ich würde gerne eine eine funktionierende Uri-Beispiel (eine Zeile code, nicht ein ganzes Projekt) WinRT => Bild-in PCL . Relative Pfade werden nicht unterstützt WinRT, also ich bin neugierig, was wäre sonst noch ein problem..
- Ich bin mir nicht sicher, was Sie nun Fragen. Vielleicht versuchen Sie eine neue Frage über die winrt - geben Sie die xaml-und c# - Sie arbeiten in wp7 oder wpf - und Frage eine konkrete Frage, wie das zu übersetzen, um winrt. Es arbeiten in rt zuerst, dann fügen Sie PCL. sein neues Territorium für uns alle, aber wir bekommen es 1 Schritt zu einer Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für eine Menge von Fällen, die Bilder sind Plattform-spezifisch. Sie müssen sorgen für die Größe und die DPI des Geräts, auf sich selbst, und brauchen würde, um fit in mit dem look and feel der Anwendung. Für diese Situationen, ich würde die Sicht selbst entscheiden, welche Bilder zu zeigen, die Benutzer, basieren wahrscheinlich auf irgendeine Art von Status - /Modus durch das ViewModel.
Diese sind jedoch Fälle, in denen die Bilder müssen aus dem ViewModel, zum Beispiel im Fall der Absender thumbnails, die angezeigt E-mail-Anwendungen. In diesen Fällen habe ich das ViewModel Rückkehr eine Art Plattform-Agnostiker " - Konzept ein Bild (wie byte[]), und dann haben die Plattform-spezifische Projekte konvertieren, die in etwas, dass Ihre UI-stack versteht (in XAML, wäre dies eine ImageSource).
Würde der code wie folgt Aussehen:
Portable Projekt:
Hinweis:, müssen Sie entfernen oder hinzufügen GetTypeInfo () - abhängig von den Plattformen, die Sie sind targeting.
Hier, wir Lesen von einer eingebetteten Ressource (Eigenschaften -> Build Action -> "Eingebettete Ressource"), aber Sie könnte sich vorstellen, diese kommen aus dem Netzwerk, oder irgendwo anders.
Windows Store-app-Projekt:
In der Windows Store-app, Sie hätte einen Wert Konverter zum umwandeln von byte[] -> ImageSource:
In der code-behind der View DataContext:
Dann in der Ansicht selbst die Bindung an das ViewModel.Image-Eigenschaft, und legen Sie die Konverter:
Bilder sind in der Tat Recht problematisch, wenn Sie brauchen, um Sie skalieren auf unterschiedlichen Plattformen mit unterschiedlichen pixel-dichten und unterschiedlichen Bildschirm-Größen.
Gepaart mit diesem, gibt es oft Probleme mit Bild-manipulation-Bibliotheken nicht tragbar - vor allem, wenn Sie verwenden hardware-Beschleunigung auf jeder Plattform.
Davon aus, dass Ihr rolodex app ist irgendwie gehen, um Benutzern zu erlauben, Bilder aufzunehmen, und dann laden Sie Sie auf einige freigegebene Datenbank/service für den späteren Leser, hier ist, wie könnte ich Vorgehen das problem. Es ist nicht die einzige Lösung - es gibt nicht "einen richtigen Weg" hier!
** Die Erfassung und das hochladen von Bildern **
Für die Erfassung der Bild (entweder aus einem Ordner oder von einer Kamera), würde ich die Verwendung eines einheitlichen Haken für jede Plattform - also NICHT PCL für diesen Teil
Wenn ich dann noch tun musste, einige auf dem Gerät die Verarbeitung des Bildes (z.B. Größe verändern oder hinzufügen einer Miniaturansicht), dann wieder das wäre wahrscheinlich anders gemacht, auf jeder Plattform - also NICHT PCL.
Sobald Sie das Foto (z.B. als JPEG-codiert in einem MemoryStream) und will auf einen server hochladen, dann würde ich wohl machen das mit dem asynchronen Handler HttpWebRequest (das sind die alten Methoden nichts zu tun mit async/await) gemeinsam PCL-code
Was läuft auf dem server...... gut, das ist fast sicher nicht PCL-code - und vielleicht verwende ich Methoden gibt es, um die Größe des Bild-in-Gerät bereit, Größen - z.B. unterschiedliche Größe der thumbnails
** Anzeigen von Bildern **
Wenn ich brauche, um anzuzeigen jemand das Bild aus der Datenbank, dann würde ich wahrscheinlich den server, um eine Liste der verfügbaren thumbnail - URLs), dies ist der server-code, so wäre nicht PCL -
App-code, der tatsächlich fragt nach der Liste der Kontakte oder Kontakt-detail - das wäre wahrscheinlich PCL-code - und wahrscheinlich HttpWebRequest wieder.
Den code Anzeigen, die den Kontakt und stellt es auf dem Bildschirm? Das wäre wahrscheinlich XAML - und ich würde nur verwenden Sie die native Image-Steuerelement auf jeder Plattform zu verwenden und unter Umständen eine entsprechende Miniaturbild für die situation.
** Wenn Sie speichern die Bilder lokal **
Wenn Sie speichern die Bilder lokal statt über einen zentralen server haben, dann werden Sie wahrscheinlich benötigen, um die Verwendung von nicht-PCL-code, für diese zu. Jede Plattform hat die gleiche grundlegende Art von Methoden: LoadFile, SaveFile, etc - und jeder stellt Mechanismen zum erstellen, auflisten, Lesen und schreiben von Dateien und Ordnern, aber jede Plattform tut dies über eine andere API, um die Datei-system (z.B. System.IO in WPF, IsolatedStorage in WP7, Silverlight, etc).
Sobald Sie haben Ihre Dateien in einem gemeinsamen(ish) Struktur, dann die PCL-control-code wird in der Lage sein, zu behandeln jede Datei nur ein paar strings - Ordner es ist in, und der name der Datei...
... und in der UI-Schicht (z.B. XAML), werden Sie wahrscheinlich in der Lage sein, um Bezug auf die Bild-Dateien direkt - wahrscheinlich kann getan werden, mit einem bestimmten ValueConverter zu generieren, die den korrekten Dateinamen oder filestream-auf jeder Plattform - z.B. bei wp7 können Sie den Konverter von Windows Phone 7-Silverlight-Bindung Bild aus der IsolatedStorage
So, meine Zusammenfassung ist:
Einige andere Dinge, die helfen könnten:
Ich Stimme Ihnen zu, dass Bild-handling", sollte wahrscheinlich an eine bestimmte Plattform gebunden. Nur als eine Allgemeine Regel etwas anzeigen Verwandte sollten nicht aufgenommen werden in eine PCL. Die obigen Antworten haben einige große technische detail, dass ich nicht die Mühe zu wiederholen, sondern wollte einen link posten, zu einem dia-deck, das ich zusammengestellt habe, zu diskutieren Prinzipien der Verwendung von PCL. http://prezi.com/ipyzhxvxjvp-/sharing-is-caring-code-reuse-in-xaml-applications/
Ich hoffe, dies gibt einige Allgemeine Hinweise, die gesamte design-Strategien und verstärkt die in den vorhergehenden Antworten.
Meisten Leute haben schon gesagt, ist auch die Antwort "Nicht möglich". UI-Elemente in der PCL geht gegen die Philosophie von PCL -, die nutzbar sein soll wie auf allen Plattformen, die Sie sind welche.
Hier ist, was MSDN zu sagen hat, auf PCL - "die Portable Class Library-Projekt enthalten keine UI-Komponenten aufgrund der verhaltensunterschiede zwischen den UIs der verschiedenen Geräte" (aus http://msdn.microsoft.com/en-us/library/gg597391.aspx)
hoffe, das hilft
Mein Erster Instinkt ist, zu sagen, Nein man sollte keine Bilder im PCL-angesichts dessen, was Sie beschrieben haben.
Aber wenn ich im Begriff waren, es zu tun, können Bilder gespeichert werden, die über Ressourcen in den verschiedenen Bibliotheken und speichern Sie ein anderes Bild für jede Plattform gibt, und machen dann eine Umwelt Prüfung, um zu bestimmen, welches Bild zu ziehen. Aber dieser Ansatz wirklich nur versucht werden sollte, wenn Sie eine Skalierung notwendig.
Durch Maßstab-ich meine, Sie sind mit offenen Quellcodes dieser Bibliothek, wo 1000 von Programmen sind, es zu benutzen. Wenn dies für Ihre eigene Verwendung für 3 oder 4 apps, ich würde sagen, nicht die Mühe, speichern Sie Ihre selbst, die Kopfschmerzen. Nur das Bild in der gemeinsam genutzten Bibliothek oder über eine config und mit ihm getan werden.
Oder einfach nicht die Verwaltung von Bildern über die PCL. Da image manipulation änderungen und unterscheidet sich auf jeder Plattform, vor allem für diejenigen, die Sie erwähnt. Und Sie verpflichtet sind, führen Sie in einige seltsame Fehler, bei dem es funktioniert einfach nicht die gleiche wie auf den anderen Plattformen.
Ich würde wahrscheinlich sogar die eigentlichen Bilddateien in jeder app. Ich glaube nicht, dass Sie viel Wert aus versuchen, Sie zu integrieren in der PCL.
In Ihrem tragbaren ViewModels, können Sie die Referenz-Bild über einen Uri. Leider, die Uri-Anforderungen zu unterscheiden, die auf jeder Plattform. Für Windows Store-apps, die es braucht, um so etwas wie
ms-appx:////Assets/image.png
wo für Windows Phone-ich denke, es wird nur/Assets/image.png
.So müssen Sie einige code, um herauszufinden, die richtige Uri-format. Das könnte eine Plattform-spezifischen Dienst mit einem tragbaren interface, dass die ViewModels nennen würde. Sie könnten auch in der Lage sein, verbindliche Konverter, der würde alles tun, was die Konvertierung, die Sie benötigt.
Gibt es sicherlich andere Möglichkeiten, dies zu tun-das ist nur das, was ich mir ausgesucht, basierend auf den Informationen in deiner Frage.
können Sie das Bild auf dem view-Modell als Typ "Objekt" und eine Schnittstelle (injiziert) zum erstellen der bitmap.
in der WPF-version, Sie könnten dies tun
Mithilfe dieser Methode können Sie Daten binden Recht am Bild und nicht ein Konverter nötig.