Silverlight PRISM和'松散'样式文件

时间:2009-09-20 15:22:34

标签: silverlight coding-style prism

我们正在寻找使用PRISM框架开始一个新的Silverlight项目(从模块等中受益),我仍然对最佳样式方法有点不清楚。我理想的是拥有可编辑的XAML文件(甚至可能只包含整个项目的1个文件),包含应用程序的样式,以便可以编辑它们以更改应用程序的外观,而无需重新编译所有内容。 这种方法是人们使用的吗?我想它需要在启动时加载文件并应用我认为不会是巨大开销的样式。

只是想知道人们使用什么方法

感谢您的时间

2 个答案:

答案 0 :(得分:2)

在Silverlight(和WPF)中,典型/常规方法是将样式和画笔保存在资源字典中。然后可以将这些换出来随时更改布局,颜色和控件模板。您可以将它们包含在构建应用程序时生成的XAP中,也可以包含在独立程序集中。

要记住的是资源文件可以在不同的级别加载。应用程序级别降至单个控件的级别。在较低级别加载的词典将优先于较高级别的词典。对我来说,将它想象成层是有帮助的。

答案 1 :(得分:2)

这是我的方法 -

在App.xaml中,您需要声明一个MergedDictionaries这样的元素..

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles\Colors.xaml" />
            <ResourceDictionary Source="Styles\Brushes.xaml" />
            <ResourceDictionary Source="Styles\Typeography.xaml" />
            <ResourceDictionary Source="Styles\ModuleAStyles.xaml />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

正如你所看到的,我倾向于在这里有一些单独的文件用于颜色(颜色,如果你正确拼写),画笔,字体,然后我通常为每个模块使用一个额外的。如果它是一个大型应用程序,则使用多个,否则您最终会在一个文件中包含太多内容,并且很快就难以维护。你只需要在这里使用你最好的判断,看看最适合你的是什么。

在我在该合并字典中引用的Typeography.xaml中,我已经声明了一个名为ApplicationTitle的样式......

<!--Application Title-->
<Style TargetType="{x:Type TextBlock}"
       x:Key="ApplicationTitle">
    <Setter Property="VerticalAlignment"
            Value="Center" />
    <Setter Property="HorizontalAlignment"
            Value="Center" />
    <Setter Property="FontFamily"
            Value="Georgia" />
    <Setter Property="Foreground"
            Value="{StaticResource ResourceKey=FlatGradientLightest}" />
    <Setter Property="FontSize"
            Value="24" />
    <Setter Property="Effect">
        <Setter.Value>
            <DropShadowEffect BlurRadius="5"
                              Color="#333"
                              Opacity=".3" />
        </Setter.Value>
    </Setter>
</Style>

您会注意到,在这种风格中,我再次使用StaticResource标记扩展来引用另一个名为“FlatGradientLightest”的资源。此资源存在于Brushes.xaml文件中......

    <!--Flat Diagonal Gradient Lightest-->
<LinearGradientBrush x:Key="FlatDiagonalGradientLightest"
                     StartPoint="0,0"
                     EndPoint="1,1">
    <GradientStop Color="{StaticResource ResourceKey=Light}"
                  Offset="0" />
    <GradientStop Color="{StaticResource ResourceKey=Lightest}"
                  Offset="1" />
</LinearGradientBrush>

这再次引用了'Colors'Light'和'Lightest'。这些存在于Colors.xaml文件中......

<Color x:Key="Light"
       A="255"
       R="190"
       G="190"
       B="190" />
<Color x:Key="Lightest"
       A="255"
       R="250"
       G="250"
       B="250" />

这里重要的是我在App.xaml中指定资源字典的顺序。如果我将Typeography.xaml移动到列表的顶部,它将导致运行时,因为在加载此样式时,它的依赖性将不存在。

由于WPF / SL向上查找资源(如Muad'Dib所指出的),您可以在模块中使用这些资源,就好像它们是在本地声明的一样。所以在我的一个模块中,我有TextBlock这样声明......

<TextBlock Text="Menu Module Loaded" Style="{StaticResource ResourceKey=ApplicationTitle}" />

TextBlock现在使用Typeography.xaml中的'ApplicationTitle'样式,它从Brushes.xaml中的'FlatGradientLightest'Foreground加载它的LinearGradientBrush画笔,然后加载两个Colours.xaml文件中来自Color资源的颜色。

有点酷吗?

希望有所帮助。