2013-03-06 11 views
11

Wie können WPF-Ressourcen - einschließlich Stilen, Vorlagen usw. - organisiert werden, sodass ich sie über Windows, Pages oder sogar Projekte hinweg verwenden kann. Welche Möglichkeiten habe ich, um eine maximale Wiederverwendbarkeit meiner Ressourcen und eine wartbare Struktur zu erreichen (zB eine Datei pro Template)?Wie organisiert man Ressourcen (Stile, ...) in einem komplexen WPF-Szenario?

Zum Beispiel: Ich erstelle eine WPF-Anwendung und ich möchte ein TabControl verwenden, aber ich möchte wichtige Änderungen daran vornehmen. Also könnte ich einen Stil erstellen und auf das TabControl und TabItem anwenden. Das ist in Ordnung, aber wo kann ich meine Ressourcen platzieren, um meinen Window XAML frei zu halten und den Stil auch von anderen Windows oder Projekten zugänglich zu machen?

Ich habe festgestellt, dass ich es zu App.xaml hinzufügen kann, aber das ist nur eine Lösung für ein Projekt und ermöglicht die Freigabe nur zwischen Elementen dieses Projekts. Außerdem denke ich, dass es besser wäre, diese Vorlagen ein wenig von anderem Code zu trennen, als alles auf einer Seite oder in einer app.xaml zu platzieren.

+0

Sie können ein ResourceDictionary erstellen und es zu einer ClassLibrary hinzufügen. Sie müssen auf Ihre App.xaml verweisen und Sie können die Bibliothek in vielen Projekten verwenden. –

Antwort

21

Normalerweise erstelle ich ein separates Styling-Projekt, das ich von den Projekten referenziere, die ich stylen möchte. Das Styling-Projekt hat eine feste Struktur wie folgt aus:

Styling project

Für jede Kontrolle, erstelle ich ein Styling ResourceDictionary. Zum Beispiel für meine Knöpfe:

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

In einem Haupt ResourceDictionary, fusionieren ich alle anderen Wörterbüchern, in diesem Fall in der Datei IncaDesign.xaml, die Sie im Bild oben sehen können:

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

Beachten Sie, wie ich die Standardstile definiert habe, die automatisch angewendet werden, sofern Sie nichts anderes angeben. In jedem Fenster oder Steuerelement, das Sie stylen möchten, müssen Sie nur auf dieses ResourceDictionary verweisen. Beachten Sie die Definition der Quelle, die einen Verweis auf die Baugruppe (/Commons.Styling;component...)

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

Standardstile wird nun automatisch eingestellt werden, und wenn Sie eine Ressource explizit zugreifen möchten, können Sie dies tun, StaticResource verwenden.

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

Dies ist sehr schöne Lösung meiner Meinung nach, die für sehr komplexe Lösungen arbeiten, auch modulare Lösungen, zum Beispiel mit PRISM gebaut.

+0

Denken Sie daran, dass ResourceDictionary-Instanzen ressourcenintensiv sind und Sie sie besser vermeiden sollten, wenn möglich. [Siehe VI.] (Http://plebyte.net/blog/2011/07/11/twelve-ways-to-improve-wpf-performance/) –

+1

Das Wichtigste ist, Querverweise und unsystematische Zusammenführung von Wörterbüchern zu vermeiden .Das verursacht wirklich Probleme, da Du ständig Duplikate all deiner Ressourcen erstellst, nicht das ResourceDictionary selbst. Ich denke, das ist der Punkt, auf den sich der Artikel bezieht, auf den Sie sich beziehen. Ich sehe keine Möglichkeit, ResourceDictionaries in einem komplexen Projekt zu vermeiden ... Und das ist genau die Idee des Styling-Projekts: Um das Verschmelzen von Wörterbüchern an vielen Stellen zu vermeiden ... – Marc

+0

Genau das, was ich gesucht habe :) Danke. Ich muss nur mehr über mögliche Probleme damit lesen. –

1

Sie können ein Projekt erstellen, das Ressourcenwörterbücher entweder in Ihrer Lösung oder in einem separaten enthält. Ihr Projekt wird ein Klassenbibliothekstyp sein und kann dann leicht von einem beliebigen anderen Projekt referenziert werden. Hier ist ein Artikel, der dies beschreibt: Resource Dictionary Article

Verwandte Themen