ResourceDictionary in un assembly separato


245

Ho file di dizionario delle risorse (MenuTemplate.xaml, ButtonTemplate.xaml, ecc.) Che desidero utilizzare in più applicazioni separate. Potrei aggiungerli agli assembly delle applicazioni, ma è meglio se compilo queste risorse in un singolo assembly e le mie applicazioni lo facciano riferimento, giusto?

Dopo aver creato l'assembly delle risorse, come posso fare riferimento in App.xaml delle mie applicazioni? Attualmente uso ResourceDictionary.MergedDictionaries per unire i singoli file del dizionario. Se li ho in un assieme, come posso fare riferimento a loro in xaml?


1
Potrebbe trattarsi di un eccesso, ma potresti voler preparare le tue risorse per l'esportazione usando la tecnica qui descritta: alexfeinberg.wordpress.com/2015/08/16/… . Il vantaggio principale di ciò è quello di evitare che vengano caricati nello stesso dominio di problemi più versioni dell'assembly di risorse.
user195275

Risposte:


353

Controlla la sintassi dell'URI del pacchetto . Vuoi qualcosa del genere:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

1
Cosa succede se YourAssembly non è contenuto nel percorso dell'applicazione?
SaneDeveloper il

@Engineer Spock: quindi il CLR non lo troverà senza aiuto (niente a che fare specificamente con WPF). Aggiungi percorsi di sondaggio al file app.config o allegaloAppDomain.AssemblyResolve per aiutarlo a trovare l'assembly.
Kent Boogaart,

1
Devo aggiungere un percorso di sondaggio se il progetto YourAssembly è allo stesso livello del progetto dell'applicazione che deve fare riferimento a YourAssembly? Ad esempio, C: \ Solution \ AppProject \ e C: \ Solution \ YourAssemblyProject \
SaneDeveloper

1
@EngineerSpock: questa è una domanda separata, quindi per favore aprine una.
Kent Boogaart,

2
Questa risposta non ha senso. Per seguirlo è già necessario sapere come farlo!
user1040323

97

Un esempio, solo per dare una risposta di 15 secondi:

Supponi di avere "styles.xaml" in una libreria WPF denominata "common" e che desideri utilizzarlo dal tuo progetto di applicazione principale:

  1. Aggiungi un riferimento dal progetto principale al progetto "comune"
  2. Il tuo app.xaml dovrebbe contenere:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Saluti


2
E poi come si rendono disponibili le risorse definite in styles.xaml tramite la finestra Proprietà di Visual Studio 2010? Se seleziono un elemento e quindi faccio clic su Applica risorsa per la sua proprietà Background, mostra solo SystemColors e non quelli definiti in styles.xaml. Ma se scrivo da solo il nome della risorsa in XAML funziona, quindi viene correttamente referenziato.
xr280xr,

Volevo solo aggiungere che se si fa riferimento a ResourceDictionary da UserControl, è necessario aggiungere un riferimento all'assembly in entrambi i punti: in UserControl e nel progetto della finestra principale. Altrimenti otterrai l'errore di runtime.
Andrejs Gasilovs,


16

DLL solo risorsa è un'opzione per te. Ma non è necessario necessariamente a meno che non si desideri modificare le risorse senza ricompilare le applicazioni. Avere solo un file ResourceDictionary comune è anche un'opzione. Dipende dalla frequenza con cui cambi risorse ed ecc.

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly : solo il nome dell'assembly senza estensione

FolderStructureInAssembly : se le risorse sono raggruppate, specificare la struttura delle cartelle

Quando lo fai, è meglio conoscere anche siteOfOrigin .

WPF supporta due autorità: application: /// e siteoforigin: ///. L'autorità application: /// identifica i file di dati dell'applicazione che sono noti al momento della compilazione, inclusi i file di risorse e contenuti. L'autorità siteoforigin: /// identifica i file del sito di origine. L'ambito di ciascuna autorità è mostrato nella figura seguente.

inserisci qui la descrizione dell'immagine


8

Per UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

4

Utilizzando XAML:

Se conosci l'altra assemblystruttura e desideri il codice resourcesin c # , usa il codice seguente:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

Output: se vogliamo utilizzare ResourceDictionary RD1.xamlProject WpfControlLibrary1nel StackOverflowAppprogetto.

Struttura dei progetti :

Struttura dei progetti

Dizionario delle risorse: Dizionario delle risorse

Uscita codice:

Produzione

PS: tutti i ResourceDictionaryfile dovrebbero avere Build Action' Resource' o ' Page'.

Usando C #:

Se qualcuno vuole la soluzione in codice puramente c # allora vedi la mia questa soluzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.