2011-12-21 10 views
16

Mam aplikację pryzmat i różne moduły. Zastanawiam się, gdzie jest najlepsze miejsce do zlokalizowania zasobów, takich jak style, pędzel, controltemplates, datatemplates?Pryzmat WPF - gdzie umieścić zasoby?

Czy powinienem sporządzić jeden słownik zasobów i umieścić w nim wszystko? Czy każdy moduł powinien mieć własne zasoby? Lub każdy widok? Chciałbym postępować zgodnie z celem Prism polegającym na zachowaniu wszystkiego co modularne, ale także nie widzę sensu w ponownym deklarowaniu tych samych zasobów w każdym module ...

Odpowiedz

30

Rozwijam aplikację z Prismem i używam techniki bardzo blisko opisane w podręczniku Prism. Jest YourApplication.Infrastructure projekt, w którym zwykle umieścić wszystkie swoje współdzielone interfejsy itp Więc:

  1. po prostu dodać YourApplication.Resources projektu
  2. Tworzenie tam folder Tematy
  3. Utwórz osobny plik XAML w folderze Motywy dla każda grupa zasobów (np. Generic.WPF.xaml dla standardowych stylów formantów WPF, Generic.Brushes.xaml dla pędzli itp.)
  4. Utwórz plik Tematy \ Generic.xaml (dokładnie z tą nazwą, doda to ogromnych korzyści w przyszłości) o treściach takich jak

    <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. Teraz można dodawać te zasoby w każdym module (masz oddzielny projekt dla niego, prawda?), Dodając odniesienie do YourApplication.Resources do tego projektu i dodanie do widoku w XAML:

    <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> 
    

Nie wiem, może ten sposób ma pewne problemy, ale działa i działa dobrze dla mnie. Jeśli ktokolwiek może skomentować w ten sposób (plusy/minusy) - będę bardzo szczęśliwy, słysząc to!

+0

Cześć , wiem, że jest trochę stary, ale trzeba go skomentować i poprosić o radę związaną z tym. Zrobiłem coś podobnego i wypróbowałem różne proste lub zaawansowane nazwy. Nazwy i adresy wydają się być poprawne.Powinniśmy zarejestrować coś w Container lub wykonać dowolne techniki inicjalizacji, aby zastosować to podejście. Wydaje mi się, że nie udało mi się znaleźć Zespołu Zasobów w czasie wykonywania? Prism 4.1, Dzięki. – LastBye

+1

@Sypress faktycznie ta metoda nie używa niczego od Prism, jest po prostu podobna do Prism. Używa tylko osadzonych funkcji WPF i XAML. Jak dokładnie mówi, że nie może znaleźć? Pokazuje błąd lub po prostu nie używa stylu z zestawu (prawdopodobnie - domyślny styl)? – chopikadze

+0

Nie można znaleźć zespołu, przeszedłem montaż przez ms-build i problem zniknął :) – LastBye

5

aplikacyjne całej zasoby zwykle umieszczone w ResourceDictionary, który jest dodany do żadnej App.xaml lub StartupWindow.xaml

Zasobów zadaniu View znajdują się zwykle przy widoku. Na przykład narzędzie UserControl, które jest używane w widoku kalendarza, będzie zawierało dowolne zasoby niestandardowe kalendarza, takie jak szczotki, style, szablony itp. Specyficzne dla kalendarza.

Zwykle nie widzę powodu, aby tworzyć moduły. szerokie zasoby, ale jeśli kiedykolwiek to zrobię, będę miał ResourceDictionary dla modułu, który można załadować do połączonych słowników aplikacji w czasie wykonywania lub uwzględnić w poszczególnych widokach w module.

2

Chciałbym podzielić się kilkoma nowymi informacjami. Używam podejścia @chopikadze. To naprawdę fajne podejście. Dzięki Tobie!

Jednakże, jeśli nie chcesz pisać za każdym razem, za każdym kontrolować te fragment kodu:

<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> 

Następnie można po prostu zadeklarować <ResourceDictionary/> w App.xaml twoich Bootstrapper tak:

<Application.Resources>   
    <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
</Application.Resources> 
Powiązane problemy