我们正在寻找使用PRISM框架开始一个新的Silverlight项目(从模块等中受益),我仍然对最佳样式方法有点不清楚。我理想的是拥有可编辑的XAML文件(甚至可能只包含整个项目的1个文件),包含应用程序的样式,以便可以编辑它们以更改应用程序的外观,而无需重新编译所有内容。 这种方法是人们使用的吗?我想它需要在启动时加载文件并应用我认为不会是巨大开销的样式。
只是想知道人们使用什么方法
感谢您的时间
答案 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
资源的颜色。
有点酷吗?
希望有所帮助。