2013-03-06 17 views
11

W jaki sposób można zorganizować zasoby WPF - w tym style, szablony itp., Aby można było ich używać w systemach Windows, na stronach lub nawet w projektach. Jakie opcje mam dostępne, aby osiągnąć maksymalne wykorzystanie moich zasobów i możliwą do utrzymania strukturę (na przykład jeden plik na szablon)?Jak organizować zasoby (style, ...) w złożonym scenariuszu WPF?

Na przykład: Tworzę aplikację WPF i chcę użyć TabControl, ale chcę wprowadzić do niej istotne zmiany. Mogłem więc stworzyć styl i zastosować go do TabControl i TabItem. W porządku, ale gdzie mogę umieścić moje zasoby, aby zachować przejrzystość okna XAML i aby styl był dostępny również z innych okien lub projektów?

Stwierdziłem, że mogę dodać go do App.xaml, ale jest to tylko rozwiązanie dla jednego projektu i umożliwia udostępnianie tylko pomiędzy elementami tego projektu. Ponadto, myślę, że lepiej byłoby, gdyby te szablony były trochę oddzielone od innych kodów, niż umieszczenie ich w jakiejś stronie lub pliku app.xaml?

+0

Możesz utworzyć ResourceDictionary i dodać go do biblioteki ClassLibrary. Musisz odwoływać się do niego w App.xaml i możesz korzystać z Biblioteki w wielu projektach. –

Odpowiedz

21

Zazwyczaj tworzę osobny projekt stylizacji, który odwołuję się do projektów, które chcę stylizować. Projekt stylizacji ma stałą strukturę takiego:

Styling project

dla każdej kontroli, tworzę stylizacji ResourceDictionary. Na przykład dla moich przycisków:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="PrimaryButtonStyle" TargetType="Button"> 
    </Style> 

    <Style x:Key="ToolbarButton" TargetType="Button"> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="Margin" Value="3"/> 
     <Setter Property="Background" Value="Transparent"></Setter> 
    </Style> 
</ResourceDictionary> 

w jednym głównym ResourceDictionary, mogę połączyć wszystkie inne słowniki, w tym przypadku w pliku IncaDesign.xaml, co można zobaczyć na zdjęciu powyżej:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:controls="clr-namespace:Commons.Controls;assembly=Commons"> 

    <ResourceDictionary.MergedDictionaries> 

     <ResourceDictionary Source="Converter/Converter.xaml" /> 
     <ResourceDictionary Source="Styles/Button.xaml" /> 
     <ResourceDictionary Source="BitmapGraphics/Icons.xaml" /> 

    </ResourceDictionary.MergedDictionaries> 

    <!-- Default Styles --> 
    <Style TargetType="Button" BasedOn="{StaticResource PrimaryButtonStyle}"></Style> 
</ResourceDictionary> 

Zwróć uwagę, jak zdefiniowałem style domyślne, które są stosowane automatycznie, chyba że określisz inaczej. W każdym oknie lub sterowaniu, które chcesz nadać styl, wystarczy odwołać się do tego ResourceDictionary. Należy zwrócić uwagę na definicję źródła, co jest nawiązaniem do montażu (/Commons.Styling;component...)

<UserControl.Resources>   
    <ResourceDictionary>    
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Commons.Styling;component/IncaDesign.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary>   
</UserControl.Resources> 

style domyślne zostaną ustawione automatycznie teraz, a jeśli chcesz uzyskać dostęp do zasobu wyraźnie, można to zrobić za pomocą StaticResource.

<Viewbox Height="16" Width="16" Margin="0,0,10,0"> 
    <ContentControl Content="{StaticResource FileIcon32}" /> 
</Viewbox> 

Jest to bardzo miłe rozwiązanie moim zdaniem, która pracuje dla bardzo skomplikowanych rozwiązań, w tym rozwiązań modułowych, na przykład zbudowany z PRISM.

+0

Należy pamiętać, że wystąpienia ResourceDictionary są zasobami cięższymi i lepiej jest unikać ich, jeśli to możliwe. [Zobacz VI.] (Http://pelebyte.net/blog/2011/07/11/twelve-ways-to-improve-wpf-performance/) –

+1

Najważniejszą rzeczą jest unikanie odniesień i niesystematyczne łączenie słowników .To właśnie powoduje problemy, ponieważ przez cały czas tworzy się duplikaty wszystkich zasobów, a nie samego ResourceDictionary. Myślę, że to jest sedno, do którego odnosi się artykuł, który łączysz. Nie widzę sposobu na uniknięcie ResourceDictionaries w złożonym projekcie ... I to jest właśnie idea projektu stylizacji: Aby uniknąć łączenia słowników w wielu miejscach ... – Marc

+0

Dokładnie tego, czego szukałem :) Dziękuję. Po prostu muszę przeczytać więcej o możliwych problemach z tym. –

1

Możesz utworzyć projekt zawierający słowniki zasobów, w swoim rozwiązaniu lub w oddzielnym. Twój projekt będzie typem biblioteki klas, a następnie będzie można go łatwo wywołać z dowolnego innego projektu. Oto artykuł opisujący to: Resource Dictionary Article

Powiązane problemy