Ключ в том, чтобы понять, что стиль может содержать 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>
Теперь при каждом изменении ButtonBackground в вашем экземпляре SkinModel все фоны кнопок будут автоматически обновляться.(Предполагается, что ваша SkinModel использует DependencyProperties или реализует INotifyPropertyChanged.)
Чтобы позволить пользователю отдельно контролировать два конца градиентной заливки, создайте два свойства SolidColorBrush в вашей SkinModel, которые связаны двухсторонним цветомсборщики.Всякий раз, когда эти свойства изменяются, пересчитывайте свойство ButtonBackground (либо в PropertyChangedCallback объекта DependencyProperty, либо в установщике свойства CLR).
Сохранение вашего состояния в файл тривиально: просто используйте XamlWriter для сериализации вашей SkinModel вXAML, затем запишите его в файл.Чтобы загрузить его позже, просто используйте XamlReader.Parse.