2011-12-21 18 views
16

Ho un'applicazione prisma e vari moduli. Mi chiedo dove sia il posto migliore per individuare risorse come stili, pennello, controltemplate, datatemplates?Prisma WPF - Dove mettere le risorse?

Devo creare un singolo dizionario di risorse e mettere tutto lì? Ogni modulo dovrebbe avere le proprie risorse? O ogni vista? Vorrei seguire l'obiettivo di Prism di mantenere tutto modulare, ma anche io non vedo il punto di riaffermare le stesse risorse in ogni modulo ...

risposta

30

Sviluppo un'applicazione con Prism e utilizzo la tecnica molto vicino a descritto nel manuale di Prism. C'è progetto YourApplication.Infrastructure, dove di solito si svolge tutte le interfacce condivisi ecc Quindi:

  1. Ho solo aggiungere YourApplication.Resources progetto
  2. Crea ci Temi cartella
  3. Creare file XAML separato nella cartella Temi per ogni gruppo di risorse (come Generic.WPF.xaml per gli stili dei controlli WPF standard, Generic.Brushes.xaml per i pennelli ecc.)
  4. Creare i file Themes \ Generic.xaml (esattamente con questo nome, aggiungerà enormi vantaggi in futuro) con contenuti come

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    
        <ResourceDictionary.MergedDictionaries> 
    
         <ResourceDictionary Source="Generic.Brushes.xaml"/> 
         <ResourceDictionary Source="Generic.WPF.xaml"/> 
    
        </ResourceDictionary.MergedDictionaries> 
    
    </ResourceDictionary> 
    
  5. Ora è possibile aggiungere tali risorse in qualsiasi modulo (si dispone di progetto separato per esso, giusto?) Con l'aggiunta di riferimento a YourApplication.Resources a tale progetto e l'aggiunta di XAML della tua vista:

    <UserControl.Resources> 
        <ResourceDictionary> 
    
         <ResourceDictionary.MergedDictionaries> 
          <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
         </ResourceDictionary.MergedDictionaries> 
    
         <!-- Put your not shared resource here --> 
    
        </ResourceDictionary> 
    </UserControl.Resources> 
    

Non so, forse in questo modo ha alcuni problemi, ma funziona, e funziona bene per me. Se qualcuno può commentare in qualche modo in questo modo (pro/contro) - sarò molto felice di sentirlo!

+0

Hi , sappi che questo è un po 'vecchio, ma era necessario commentarlo e chiedere un consiglio relativo a questo. Ho fatto simile a questo e ho provato diversi nomi semplici o avanzati. I nomi e gli indirizzi sembrano essere corretti.Dovremmo registrare qualcosa nel contenitore o fare alcune tecniche di inizializzazione per utilizzare questo approccio. Per quanto mi sembra, non è stato possibile trovare l'assembly delle risorse in fase di runtime? Prisma 4.1, grazie. – LastBye

+1

@Sypress in realtà questo metodo non utilizza nulla da Prism, è solo Prism-like. Utilizza solo le funzioni integrate WPF e XAML. Come dice esattamente che non potrebbe trovare? Ti mostra un errore o semplicemente non usa lo stile da assembly (probabilmente - stile predefinito)? – chopikadze

+0

Impossibile trovare l'assembly, ho passato l'assembly via ms-build e il problema è andato :) – LastBye

5

risorse a livello di applicazione di solito messo in un ResourceDictionary, che si aggiunge a uno o App.xamlStartupWindow.xaml

risorse per una specifica vista sono di solito si trova con la vista. Ad esempio, un UserControl che viene utilizzato per un CalendarView conterrà qualsiasi risorsa personalizzata per il Calendario, come pennelli specifici del calendario, stili, modelli, ecc.

Di solito non vedo un motivo per rendere il modulo- ampie risorse, ma se mai dovrei avere un ResourceDictionary per il modulo che può essere caricato nei dizionari uniti dell'applicazione in fase di runtime, o incluso in singole viste nel modulo.

2

Vorrei condividere alcune nuove conoscenze. Sto usando l'approccio @chopikadze. Ed è un approccio davvero interessante. Grazie a te!

Tuttavia, se non si vuole scrivere ogni volta per ogni controllo questi pezzo di codice:

<UserControl.Resources> 
    <ResourceDictionary>  
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
     </ResourceDictionary.MergedDictionaries>  
     <!-- Put your not shared resource here -->  
    </ResourceDictionary> 
</UserControl.Resources> 

Poi si può solo dichiarare <ResourceDictionary/> in App.xaml della vostra Bootstrapper così:

<Application.Resources>   
    <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
</Application.Resources> 
Problemi correlati