如何在复杂的WPF场景中组织资源(样式,...)?

如何在复杂的WPF场景中组织资源(样式,...)?

问题描述:

如何组织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

我通常会创建一个独立的样式项目,我从项目中引用,我想要样式。该造型的项目有一个固定的结构是这样的:

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

A ResourceDictionary是你正在寻找的。

Here is an explanation for how to use them within and across projects

您可以在解决方案中或单独创建一个包含资源字典的项目。您的项目将是一个类库类型,然后可以很容易地从任何其他项目引用.dll。这里是描述这个的文章:Resource Dictionary Article