我非常喜欢WPF,因为它通过动态更改资源来获得令人敬畏的皮肤支持,但问题是,样式必须由XAML中的设计人员制作。我的客户端需要一个可换肤的UI,最终用户可以自己制作皮肤。我的问题是 -
在Photoshop中,您可以拍摄任何图像,并添加颜色叠加层以将所有颜色更改为该色调。你能在WPF上做类似的事情吗?我只是一个初学者,看几个WPF样式,似乎所有的颜色值都是硬编码的。
以下是一个示例场景 - 用户从颜色选择器中选择两种颜色,所有控件都具有从Color1到Color2的渐变背景。
编辑:颜色可以保存到XML文件中并再次加载吗?
答案 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可能非常合适)并将它们放入控件将绑定到的类中。这样,您可以使用颜色选择器为用户更改这些数据。