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

问题描述:

我真的很喜欢WPF,因为它通过改变resourcedictionaries的动态皮肤支持,但赶上,风格必须由设计师在XAML。我的客户需要一个可换肤的用户界面,最终用户可以自己制作皮肤。我的问题是 -是否可以制作可自定义的WPF样式?

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

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

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

关键是要认识到,一个样式可以包含DynamicResource或绑定,因此,如果你的风格是:

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

现在,每当ButtonBackground在SkinModel情况的变化,所有按钮的背景将自动更新。 (这假定你的SkinModel使用DependencyProperties或实现INotifyPropertyChanged。)

为了让用户分别控制渐变填充的两端,可以在SkinModel中创建两个由颜色拾取器从双向绑定的SolidColorBrush属性。只要这些属性发生更改,请重新计算ButtonBackground属性(在DependencyProperty的PropertyChangedCallback中或在CLR属性的setter中)。

将状态保存到文件中很简单:只需使用XamlWriter将您的SkinModel序列化为XAML,然后将其写入文件即可。稍后加载它,只需使用XamlReader.Parse即可。

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