2013-03-06 48 views
11

如何組織WPF資源(包括樣式,模板等),以便我可以跨Windows,Pages或甚至Projects使用它們。我有什麼選擇可以實現資源的最大重用性和可維護的結構(例如,每個模板一個文件)?如何在複雜的WPF場景中組織資源(樣式,...)?

例如:我正在創建一個WPF應用程序,我想使用TabControl,但我想對其進行重大更改。所以我可以創建一個樣式並將其應用於TabControl和TabItem。沒關係,但我可以在哪裏放置資源以保持我的Window XAML清晰,並且可以從其他Windows或項目訪問該樣式?

我發現我可以將其添加到App.xaml,但這只是一個項目的解決方案,並允許在該項目的項目之間共享。另外,我認爲將這些模板與其他代碼稍微分開比將它們全部放在某個頁面或app.xaml中會更好?

+0

您可以創建ResourceDictionary並將其添加到ClassLibrary中。您必須在App.xaml上引用它,並且可以在許多項目中使用該庫 – 2013-03-06 14:11:55

回答

21

我通常會創建一個獨立的樣式項目,我從項目中引用,我想要樣式。該造型的項目有一個固定的結構是這樣的:

Styling project

對於每一個控制,我創建了一個造型ResourceDictionary。例如,對於我的按鈕:

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

在一個主ResourceDictionary,我合併所有其他字典,在這種情況下,在文件IncaDesign.xaml,您可以在圖片中看到上面:

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

注意我是如何定義自動應用的默認樣式的,除非您另有指定。在每一個窗口或控件中,你想要的風格,你只需要參考這一個ResourceDictionary。注意源的定義,這是大會(/Commons.Styling;component...

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

默認樣式會自動現在可以設置一個參考,如果你想明確地訪問資源,你可以做到這一點,利用StaticResource

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

這是在我看來,這適用於非常複雜的解決方案,包括模塊化解決方案,例如使用PRISM建立了非常好的解決方案。

+0

請記住,ResourceDictionary實例的資源很重,如果可能,最好避免它們。 [見VI。](http://pelebyte.net/blog/2011/07/11/twelve-ways-to-improve-wpf-performance/) – 2013-03-06 14:26:10

+1

最重要的是避免交叉引用和字典的非系統合併。這是真正造成麻煩的原因,因爲您始終創建所有資源的副本,而不是ResourceDictionary本身。我認爲這是關鍵,你所鏈接的文章指的是。我沒有看到在複雜項目中避免使用ResourceDictionaries的方法......這正是造型項目的想法:爲了避免在許多地方合併字典... – Marc 2013-03-06 14:31:03

+0

正是我在找的東西:)謝謝。我只是必須閱讀更多關於這個可能的問題。 – 2013-03-06 15:41:42

1

您可以在解決方案中或單獨創建一個包含資源字典的項目。您的項目將是一個類庫類型,然後可以很容易地從任何其他項目引用.dll。這裏是描述這個的文章:Resource Dictionary Article