2010-01-18 2 views
5

Ho pubblicato una domanda qualche mese fa su sharing resource dictionaries across assemblies. Si scopre che è possibile farlo utilizzando l'estensione di markup della chiave di risorsa del componente. All'epoca, potevo farlo funzionare solo con un progetto di controllo personalizzato WPF, non con un semplice progetto Libreria di classi.Differenze tra la libreria di controlli personalizzati WPF e la libreria di classi normale?

Ora ho bisogno di utilizzare un progetto di libreria di classi esistente per ospitare un dizionario di risorse condivise. Ciò significa che è necessario eseguire il retrofit del progetto Libreria di classi per supportare l'estensione di markup della chiave di risorsa del componente. Ho aggiunto una cartella Temi e un documento del dizionario delle risorse Generic.xaml al progetto Libreria di classi, nonché riferimenti a PresentationCore, PresentationFramework e WindowsBase. Sfortunatamente, questo non sembra fare il trucco.

Quindi, ecco la mia domanda: Oltre a quanto sopra, che cosa fa un progetto Libreria di librerie personalizzate WPF che un semplice progetto Libreria di classi non lo fa? O, per dirla in altro modo, cos'altro potrei aggiungere al mio progetto di libreria di classi per far funzionare questa funzione? Grazie.

+0

L'estensione di markup della chiave di risorsa del componente non funziona. Ho impostato due soluzioni identiche, una con una libreria di controlli personalizzati e l'altra con una semplice libreria di classi con i riferimenti DLL e Temi/Generico.xaml. L'estensione di markup della chiave di risorsa del componente funziona nella libreria di controlli personalizzati, ma non nella libreria di classi. –

+0

Ho risolto il problema sostituendo la vecchia libreria di classi con una libreria di controlli personalizzata e spostando tutte le classi dalla libreria di classi alla libreria di controlli personalizzata. Ma mi piacerebbe ancora capire come riadattare una libreria di classi, perché probabilmente la ritroverò di nuovo. –

+0

Strano. Quanto segue ha funzionato per me: creare un progetto di libreria di classi, aggiungere riferimenti a WPF DLL, aggiungere un tema/Generic.xaml (nessuna opzione del dizionario di risorse creata come UserControl e modificato XAML come un riferimento a risorse), creato un CRK in una classe (basato sulla tua domanda collegata), ha aggiunto una risorsa a generic.xaml con x: Key impostata su quel CRK. Compilami bene per me (VS2008 SP1). Non avevo bisogno del ThemeInfoAttribute menzionato da Cameron. Potrebbe valere la pena postare il tuo file XAML? – itowlson

risposta

6

Oltre ai riferimenti WPF aggiuntivi, il modello di libreria di controllo personalizzato WPF ha un attributo extra in AssemblyInfo.

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
)] 

ThemeInfoAttribute specifica la posizione in cui dizionari tematici sono memorizzati per i tipi in un assieme.

+0

Si noti che non ho testato questa soluzione, ma sicuramente ha senso. Mi aspetterei la mancanza di quell'attributo al supporto di Themes/generic.xaml diable. –

1

La risposta di Cameron MacFarland era azzeccata. Ora l'ho provato e funziona.

Ecco la soluzione: aggiungere i riferimenti DLL e il file Themes/generic.xaml al progetto di libreria di classi. Poi, AssemblyInfo.cs aperti e aggiungere il seguente codice alla fine del file:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
)] 

ricompilare e l'estensione di markup chiave di risorsa Component dovrebbero funzionare.

+0

Ho trovato una soluzione più semplice per la condivisione delle risorse tra assembly, utilizzando gli URI del pacchetto invece di ComponentResourceKeys.L'approccio è documentato qui: http://stackoverflow.com/questions/2095031/wpf-sharing-resources-across-assemblies –

2

Un'altra differenza è nel file Csproj:

Nella libreria di classi Tag manca:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> 

Dopo aver aggiunto alla prima PropertyGroup, il menu Aggiungi del progetto ora mostra il tipico File WPF.