首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置、设置设置和设置处理程序

设置、设置设置和设置处理程序
EN

Code Review用户
提问于 2015-05-05 19:47:28
回答 1查看 258关注 0票数 10

所以,回到这个问题,我构建了一组设置。现在,我正在努力清理整个系统。

这是abstract基类:

代码语言:javascript
复制
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));
        }
    }
}

下面是一个建立在它之上的设置:

代码语言:javascript
复制
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();
    }
}

我创建这样一个设置的实例:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
<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>

它的处理方式如下:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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中使用它的方式:

代码语言:javascript
复制
<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是这样的:

代码语言:javascript
复制
<local:ThemeToLBStyleConverter x:Key="LBStylePick" />
<local:ThemeToLBIStyleConverter x:Key="LBIStylePick" />

C#:

代码语言:javascript
复制
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上查看。

EN

回答 1

Code Review用户

发布于 2015-05-06 03:04:19

  • ThemeToLBStyleConverterThemeToLBIStyleConverter有相同的代码,除了方括号中的字符串。它们都应该是其他东西的子类,字符串作为成员。
  • ApplicationThemeProvider中,您应该使用.TryGetValue()而不是.ContainsKey()和查找。
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/88916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档