2012-12-02 9 views
10

La mia situazione è questa. Ho diversi progetti con una soluzione WPF che costituiscono un'applicazione multilivello che sto sviluppando. Poiché a volte i progetti separati devono accedere alla stessa immagine o risorsa xaml, vorrei centralizzare le risorse "pubbliche" in un progetto a cui è possibile fare riferimento da qualsiasi altro progetto che richiede queste risorse "pubbliche". Ad esempio, ho un'immagine BMP che uso in vari controlli e finestre in progetti separati che fungono da banner/logo. Sembra che dovrei essere in grado di aggiungere questa immagine come risorsa al progetto delle risorse pubbliche e farla riferimento ai miei altri progetti invece di aggiungere l'immagine separatamente a ogni progetto che ne ha bisogno. Se è possibile, come apparirebbe e come dovrei farlo? Se la mia idea fa schifo, sono aperto ai suggerimenti, ma il progetto sarà piuttosto ampio, quindi non voglio aggiungere risorse ovunque.WPF Centralizza risorse xaml/image nella soluzione di applicazione multi-livello/progetto

Grazie!

P.S. Ho cercato un po 'questo argomento ma ci sono così tante risposte spazzatura da persone che non sanno cosa stanno facendo. Dato che sono relativamente nuovo a WPF preferirei avere una risposta diretta al mio problema.

risposta

21

Bene, dopo un po 'di tentativi e ricerche ho trovato una soluzione alla mia domanda. Sembra che frammenti della mia risposta siano stati sparsi per tutto il web, quindi cercherò di spiegare tutto in una volta, in un posto. Per ricapitolare, sostanzialmente volevo centralizzare le risorse utilizzate nei progetti all'interno della mia soluzione. Questi sono i passi che alla fine ho seguito per realizzare questo.

1. Creare un progetto di controllo utente nella soluzione (qualsiasi progetto che può ospitare Dizionari risorsa farà). Mi riferirò a questo progetto come "il progetto della risorsa".

2. Aggiungere qualsiasi file di risorse (immagini ecc.) Che si desidera condividere tra progetti e il progetto di risorsa. Cerco di organizzare i file in sottodirectory che hanno senso. Dovrai impostare l'azione di compilazione su "Risorsa" in modo che venga compilata nel file binario di output.

3. Ora aggiungere un dizionario di risorse al progetto di risorse. Nel mio caso ho voluto fare riferimento a diverse immagini, quindi ne ho creato uno chiamato "ImageDictionary.xaml".

4. Aggiungere riferimenti ai file di immagine nel dizionario risorse. Qui sto facendo riferimento alle immagini ma è solo un dizionario delle risorse, puoi inserire qualsiasi cosa lì dentro. La stringa nel mezzo è solo il percorso relativo al file immagine a cui ti stai riferendo.

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

5. Passare ad un progetto che richiede il dizionario risorse che hai appena fatto al punto 4. Può essere un altro controllo utente o una finestra, a prescindere. Fare clic con il tasto destro sui riferimenti del progetto e aggiungere un riferimento al progetto di risorse.

6. OK ora il progetto corrente deve fare riferimento al dizionario che hai fatto nel passaggio 4 che è definito nel progetto di risorsa. Ho creato un controllo utente per primo, ecco come sarebbe il mio codice qui sotto ... Nota che ho usato i dizionari uniti. Ho intenzione di usarne più tardi, quindi ho scelto questo modo invece di un singolo dizionario. "ResourceProject" di seguito è il nome del progetto/assembly a cui è stata aggiunta la risorsa. "componente" è una parola chiave che deve essere presente, seguita dal percorso del file di codice xaml del dizionario.

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

Come si può vedere, il riferimento a un dizionario di risorse esterno richiede qualcosa chiamato "URI di pacchetto". Ho trovato un modo breve di farlo. La lunga strada è un po 'più brutta e, per quanto ne so, non vi è alcun vantaggio. Ma ecco come appare la lunga strada.

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

7. Ora che il progetto attuale ha un riferimento al dizionario risorse nel progetto di risorse, è possibile utilizzare qualsiasi cosa, da quel dizionario. Sono andato avanti e ho messo un'immagine nel mio controllo utente. Di seguito è riportato il codice. È proprio come fare riferimento a un dizionario localmente.

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

8. Nota importante! Questo mi ha causato mal di testa per un po 'prima che lo trovassi. Assicurati che il progetto di avvio nella tua soluzione abbia un riferimento al progetto delle risorse ANCHE SE IL PROGETTO DI AVVIO NON UTILIZZA IL PROGETTO RISORSE. (I riferimenti del clic destro, aggiungere riferimenti ecc ...) Le risorse non verranno compilate nell'output a meno che non lo facciate. Questa parte è stata complicata perché il progettista mostrava persino le mie immagini e non avevo errori xaml, ma in fase di esecuzione generava la proprietà set e non trovava eccezioni ai file. Questo è andato via quando ho fatto riferimento al mio progetto di risorse dal mio progetto di avvio.

Speriamo che questo aiuti qualcuno. Di seguito sono riportati alcuni collegamenti a pochi posti (incluso lo stackoverflow) che mi hanno dato ciò di cui avevo bisogno per mettere insieme tutti i pezzi.

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

eccellente po 'di ricerca lì. Proprio quello di cui avevo bisogno +1. – Andez

+0

Grazie mille, non ho potuto farlo funzionare prima, perché mi mancava il passaggio 8 :(. Ma ora funziona, brillante :) – adminSoftDK

+0

posso aggiungere nel dizionario delle risorse? – bigworld12

Problemi correlati