關鍵是要認識到,一個樣式可以包含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即可。