是否可以制作可自定义的WPF样式?

时间:2010-06-11 06:11:18

标签: wpf silverlight xaml

我非常喜欢WPF,因为它通过动态更改资源来获得令人敬畏的皮肤支持,但问题是,样式必须由XAML中的设计人员制作。我的客户端需要一个可换肤的UI,最终用户可以自己制作皮肤。我的问题是 -

在Photoshop中,您可以拍摄任何图像,并添加颜色叠加层以将所有颜色更改为该色调。你能在WPF上做类似的事情吗?我只是一个初学者,看几个WPF样式,似乎所有的颜色值都是硬编码的。

以下是一个示例场景 - 用户从颜色选择器中选择两种颜色,所有控件都具有从Color1到Color2的渐变背景。

编辑:颜色可以保存到XML文件中并再次加载吗?

2 个答案:

答案 0 :(得分:1)

关键是要意识到Style可以包含DynamicResource或Binding,所以如果你的风格是:

<Style TargetType="{x:Type Button}">
  <Setter Property="Background" Value="{DynamicResource UserSelectedBackground}" />
  ...
</Style>

您设置为“UserSelectedBackground”资源的任何内容都将应用于所有按钮。

或者,您可以绑定到视图模型对象:

<Style TargetType="{x:Type Button}">
  <Setter Property="Background" Value="{Binding ButtonBackground, Source={x:Static my:SkinModel.Instance}" />
  ...
</Style>

现在,只要SkinModel实例中的ButtonBackground发生更改,所有按钮背景都会自动更新。 (这假设您的SkinModel使用DependencyProperties或实现INotifyPropertyChanged。)

要允许用户单独控制渐变填充的两端,请在SkinModel中创建两个由颜色选择器双向绑定的SolidColorBrush属性。只要这些属性发生更改,就重新计算ButtonBackground属性(在DependencyProperty的PropertyChangedCallback中或在CLR属性的setter中)。

将状态保存到文件是微不足道的:只需使用XamlWriter将SkinModel序列化为XAML,然后将其写入文件即可。要稍后加载它,只需使用XamlReader.Parse。

答案 1 :(得分:0)

您可以将颜色值存储在XML / DataBase中(sqllite可能非常合适)并将它们放入控件将绑定到的类中。这样,您可以使用颜色选择器为用户更改这些数据。