2012-12-02 6 views
10

Meine Situation ist dies. Ich habe mehrere Projekte unter einer WPF-Lösung, die eine mehrschichtige Anwendung bilden, die ich entwickle. Da separate Projekte manchmal auf dasselbe Image oder dieselbe XAML-Ressource zugreifen müssen, möchte ich "Public" -Ressourcen auf ein Projekt zentralisieren, auf das alle anderen Projekte verweisen können, die diese "Public" -Ressourcen benötigen. Zum Beispiel habe ich ein BMP-Bild, das ich in verschiedenen Steuerelementen und Fenstern in separaten Projekten verwende, die als Banner/Logo dienen. Es scheint, als ob ich in der Lage wäre, dieses Bild als eine Ressource zu dem öffentlichen Ressourcen-Projekt hinzuzufügen und es von meinen anderen Projekten zu beziehen, anstatt das Bild separat zu jedem Projekt hinzuzufügen, das es benötigt. Wenn das möglich ist, wie würde es aussehen und wie soll ich es machen? Wenn meine Idee nur scheiße ist, bin ich offen für Vorschläge, aber das Projekt wird ziemlich groß sein, also möchte ich nicht überall Ressourcen hinzufügen.WPF zentralisieren xaml/image Ressourcen in Multi-Tier/Projekt Anwendungslösung

Danke!

P.S. Ich habe dieses Thema ziemlich viel gesucht, aber es gibt so viele Müll Antworten da draußen von Leuten, die nicht wissen, was sie tun. Da ich WPF relativ neu bin, würde ich lieber eine direkte Antwort auf mein Problem bekommen.

Antwort

21

Gut nach etwas Basteln und Nachforschung fand ich eine Lösung für meine eigene Frage. Es scheint, als ob Teile meiner Antwort im Internet verstreut wären, also werde ich versuchen, die ganze Sache auf einmal zu erklären. Um das Cap zu rekapitalisieren, wollte ich im Prinzip alle Ressourcen zentralisieren, die in Projekten innerhalb meiner Lösung verwendet werden. Dies sind die Schritte, denen ich letztendlich gefolgt bin, um dies zu erreichen.

1. Erstellen Sie ein Benutzersteuerungs-Projekt in Ihrer Lösung (jedes Projekt, das Ressourcen-Wörterbücher hosten kann). Ich werde dieses Projekt als "das Ressourcenprojekt" bezeichnen.

2. Fügen Sie alle Ressourcendateien (Bilder usw.) hinzu, die Sie zwischen Projekten für das Ressourcenprojekt freigeben möchten. Ich versuche, Dateien in Unterverzeichnissen zu organisieren, die Sinn ergeben. Sie sollten die Erstellungsaktion auf "Ressource" festlegen, damit sie in die Ausgabebinärdatei kompiliert wird.

3. Fügen Sie nun dem Ressourcenprojekt ein Ressourcenwörterbuch hinzu. In meinem Fall wollte ich mehrere Bilder referenzieren, also habe ich ein "ImageDictionary.xaml" genannt.

4. Fügen Sie Verweise auf die Bilddateien im Ressourcenwörterbuch hinzu. Ich verweise hier auf Bilder, aber es ist nur ein Ressourcenwörterbuch, in das du alles hineinlegen kannst. Die Zeichenfolge in der Mitte ist nur der relative Pfad zu der Bilddatei, auf die Sie sich beziehen.

<ImageSource x:Key="SomeImageKey"> 
    Images/SomeImage.bmp 
</ImageSource> 

5. nun zu einem Projekt gehen, das die Ressource Wörterbuch erfordert, dass Sie nur in Schritt 4. Es kann eine anderen Benutzer Steuerung oder ein Fenster sein, was auch immer. Klicken Sie mit der rechten Maustaste auf Projektreferenzen und fügen Sie einen Verweis auf das Ressourcenprojekt hinzu.

6. Nun muss das aktuelle Projekt auf das in Schritt 4 erstellte Wörterbuch verweisen, das im Ressourcenprojekt definiert ist. Ich habe zuerst ein Benutzersteuerelement erstellt, so dass mein Code wie folgt aussehen würde ... Beachten Sie, dass ich gemischte Wörterbücher verwendet habe. Ich habe vor, später mehr zu verwenden, also wählte ich diesen Weg anstelle eines einzelnen Wörterbuchs. "ResourceProject" ist der Name des Projekts/der Assembly, dem Sie die Ressource hinzugefügt haben. "Komponente" ist ein Schlüsselwort, das da sein muss, gefolgt vom Pfad zur Wörterbuch-XAML-Codedatei.

Wie Sie sehen können, erfordert das Verweisen auf ein externes Ressourcenwörterbuch etwas, das als "Pack URI" bezeichnet wird. Ich fand einen kurzen Weg, es zu tun. Der lange Weg ist ein bisschen hässlicher und so weit ich weiß, hat das keinen Vorteil. Aber hier ist, wie der lange Weg aussieht.

<UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary>   
    </UserControl.Resources> 

7. Nun, da Ihr aktuelles Projekt einen Verweis auf das Ressourcenverzeichnis in dem Ressource-Projekt hat, kann man alles von diesem Wörterbuch verwenden. Ich ging voran und legte ein Bild in meine Benutzerkontrolle. Unten ist der Code. Es ist wie ein Wörterbuch lokal referenzieren.

<Image Source="{StaticResource SomeImageKey}" /> 

8. Wichtiger Hinweis! Das hat mir eine Weile Kopfschmerzen bereitet, bevor ich es gefunden habe. Stellen Sie sicher, dass das Startprojekt in Ihrer Lösung einen Verweis auf das Ressourcenprojekt hat, AUCH WENN DAS STARTUP-PROJEKT DAS RESSOURCENPROJEKT NICHT BENUTZT. (Z. B. mit der rechten Maustaste auf Verweise klicken, Verweis hinzufügen usw.) Die Ressourcen werden nur dann in die Ausgabe kompiliert, wenn Sie dies tun. Dieser Teil war knifflig, weil der Designer sogar meine Bilder zeigte und ich keine xaml-Fehler hatte, aber zur Laufzeit würde er Set-Eigenschaften werfen und Datei-Exceptions nicht finden. Dies ging weg, als ich mein Ressourcenprojekt von meinem Startprojekt referenzierte.

Hoffentlich hilft das jemand. Im Folgenden finden Sie einige Links zu einigen Stellen (einschließlich stackoverflow), die mir die benötigten Informationen zum Zusammenfügen der einzelnen Teile gaben.

http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-consuming-resource-dictionaries-in-wpf-and-silverlight.aspx

Load WPF styles or other Static Resources from an external file or assembly

ResourceDictionary in a separate assembly

+0

Excellent wenig Forschung gibt. Genau was ich brauchte +1. – Andez

+0

Vielen Dank, ich konnte es vorher nicht funktionieren, weil ich Schritt 8 verpasst habe :(. Aber jetzt funktioniert es, brilliant :) – adminSoftDK

+0

kann ich im Ressourcenwörterbuch hinzufügen? – bigworld12