所以,回到这个问题,我构建了一组设置。现在,我正在努力清理整个系统。
这是abstract基类:
public class SettingChangedEventArgs : EventArgs
{
public int NewSetting { get; private set; }
public SettingChangedEventArgs(int newSetting)
{
NewSetting = newSetting;
}
}
public abstract class ApplicationSettingsProvider
{
public abstract int GetCurrentSetting();
public abstract void SetCurrentSetting(int setting);
public event EventHandler<SettingChangedEventArgs> SettingChanged;
public void OnSettingChanged(int newSetting)
{
var handler = SettingChanged;
if (handler != null)
{
handler(this, new SettingChangedEventArgs(newSetting));
}
}
}下面是一个建立在它之上的设置:
public class ApplicationThemeProvider : ApplicationSettingsProvider
{
public ApplicationThemeProvider()
{
ApplicationData.Current.DataChanged += (a, o) =>
{
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
OnSettingChanged((int)ApplicationData.Current.RoamingSettings.Values["Theme"]);
});
};
}
public override int GetCurrentSetting()
{
if (ApplicationData.Current.RoamingSettings.Values.ContainsKey("Theme"))
{
int value = (int)ApplicationData.Current.RoamingSettings.Values["Theme"];
return (value >= 0 && value <= 2) ? value : 0;
}
return 0;
}
public override void SetCurrentSetting(int theme)
{
ApplicationData.Current.RoamingSettings.Values["Theme"] = theme;
ApplicationData.Current.SignalDataChanged();
}
}我创建这样一个设置的实例:
private static ApplicationSettingsProvider _ThemeProvider = new ApplicationThemeProvider();
private static HomePageVM Data = new HomePageVM(_ThemeProvider);
private static Settings settings = new Settings(_ThemeProvider);
public MainPage()
{
this.InitializeComponent();
SettingsPane.GetForCurrentView().CommandsRequested += OnCommandsRequested;
this.DataContext = Data;
_ThemeProvider.SettingChanged += (s, e) => { Data.Theme = e.NewSetting; };
}在settings SettingsPane中:
<StackPanel>
<TextBlock FontSize="15" Margin="0,5">Text and background color:</TextBlock>
<ComboBox Name="Theme" SelectionChanged="ThemeChanged">
<ComboBoxItem Content="Black on White/Purple" Foreground="Black" Background="White"/>
<ComboBoxItem Content="White on Black/White" Foreground="White" Background="Black"/>
<ComboBoxItem Content="Black on White/Gold" Foreground="Black" Background="White"/>
</ComboBox>
</StackPanel>它的处理方式如下:
private ApplicationSettingsProvider _ThemeProvider;
public Settings(ApplicationSettingsProvider themeProvider)
{
this.InitializeComponent();
_ThemeProvider = themeProvider;
InitSettings();
}
private void InitSettings()
{
Theme.SelectedIndex = _ThemeProvider.GetCurrentSetting();
}
private void ThemeChanged(object sender, SelectionChangedEventArgs e)
{
_ThemeProvider.SetCurrentSetting(Theme.SelectedIndex);
}在我用于Page的VM中:
private ApplicationSettingsProvider _ThemeProvider;
private int _theme = 0;
public int Theme
{
get { return _theme; }
set
{
if (_theme != value)
{
_theme = value;
OnPropertyChanged();
}
}
}
public HomePageVM(ApplicationSettingsProvider themeProvider)
{
_ThemeProvider = themeProvider;
Theme = _ThemeProvider.GetCurrentSetting();
}这就是我在HomePage.xaml中使用它的方式:
<ListBox Name="Items" Grid.Column="0" Grid.RowSpan="2" ItemsSource="{Binding ItemList}" DisplayMemberPath="Title" SelectionChanged="OnSelectionChanged"
Tapped="Items_Tapped" Margin="-2,-2,0,-2" KeyDown="ItemsKeyDown" Style="{Binding Theme, Converter={StaticResource LBStylePick}}"
ItemContainerStyle="{Binding Theme, Converter={StaticResource LBIStylePick}}" Padding="0,10" SelectedItem="{Binding CurrentItem, Mode=TwoWay}" />我创作的Converters是这样的:
<local:ThemeToLBStyleConverter x:Key="LBStylePick" />
<local:ThemeToLBIStyleConverter x:Key="LBIStylePick" />C#:
public class ThemeToLBStyleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if ((int)value == 2) { return Application.Current.Resources["LBGold"]; }
else if ((int)value == 1) { return Application.Current.Resources["LBDark"]; }
else { return Application.Current.Resources["LBLight"]; }
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return new NotImplementedException();
}
}
public class ThemeToLBIStyleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if ((int)value == 2) { return Application.Current.Resources["LBIGold"]; }
else if ((int)value == 1) { return Application.Current.Resources["LBIDark"]; }
else { return Application.Current.Resources["LBILight"]; }
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return new NotImplementedException();
}
}这看起来相当复杂,尽管它工作得很好。此外,我不喜欢用普通的int来处理所有的主题值,enum看起来很整齐。我正在努力将ints改为enums,但在调整每一个使用它的东西之前,我想知道我是否应该以任何方式改变这个过程,这样我的所有工作都不会白费。
我的其他两种设置可以在提供的链接的PasteBin上查看。
发布于 2015-05-06 03:04:19
ThemeToLBStyleConverter和ThemeToLBIStyleConverter有相同的代码,除了方括号中的字符串。它们都应该是其他东西的子类,字符串作为成员。ApplicationThemeProvider中,您应该使用.TryGetValue()而不是.ContainsKey()和查找。https://codereview.stackexchange.com/questions/88916
复制相似问题