文章目录
- 系统参数字典
- 加载参数
- 自动加载配置文件
 
txt阅读器系列:
- 需求分析和文件读写
- 目录提取类💎列表控件与目录💎快捷键翻页
- 字体控件绑定💎前景/背景颜色
- 书籍管理系统💎用树形图管理书籍
- 语音播放💎播放进度显示💎快进快退💎自定义语速控件💎Binding
- 文本清理的布局💎段落合并💎编码检测💎保存配置文件
系统参数字典
回顾我们需要加载和保存的系统参数

考虑到参数字典中主要调用了ComboBox和AdvanceSlider,逐个添加其实比较麻烦,为了更加便捷,可以将这些控件编辑成字典,可在加载和保存参数时被调用。
- Dictionary<string, ComboBox> dctComboBoxes;
- Dictionary<string, AdvanceSlider> dctAdvanceSliders;
字典中的控件必须等待初始化完成后才能创建,故创建一个初始化参数字典的函数,并在init()结束之后调用。完成后的MainWindow和initParaDct内容如下
public MainWindow()
{
    InitializeComponent();
    init();
    PreviewKeyDown += MainWindow_PreviewKeyDown;
    initParaDct();
}
public void initParaDct()
{
    dctComboBoxes = new Dictionary<string, ComboBox>
    {
        {"字体", cbFont },
        {"前景", cbForeColor},
        {"背景", cbBgColor },
        {"区域", cbSoundCulture },
        {"音源", cbSoundSource },
        {"编码", cbEncoding }
    };
    dctAdvanceSliders = new Dictionary<string, AdvanceSlider>
    {
        {"尺寸", sFontSize },
        {"音量", sSoundVolume},
        {"语速", sSpeechRate},
    };
}
这样一来,getParaJson函数就可以简化为
private string getParaJson()
{
    private string getParaJson()
    {
        var dct = new Dictionary<string, string>();
        foreach (var item in dctComboBoxes)
            dct[item.Key] = item.Value.Text;
        foreach (var item in dctAdvanceSliders)
            dct[item.Key] = $"{item.Value}";
        foreach (var item in fmtCheckBoxes)
            dct[item.Content.ToString()] = item.IsChecked.ToString();
        return JsonConvert.SerializeObject(dct, Formatting.Indented);
    }
}
加载参数
加载参数是保存参数的逆过程,但问题在于,所有参数都可以合法地转为字符串,但字符串并不能合法地转化为所有控件参数,故而在加载参数时,需要注意一点技巧。
private void loadParaJson(string filePath)
{
    if (!File.Exists(filePath))
        return;
    string js = File.ReadAllText(filePath);
    var dct = JsonConvert.DeserializeObject<Dictionary<string, string>>(js);
    foreach (var item in dctComboBoxes)
        if (dct.ContainsKey(item.Key))
            item.Value.SelectedItem = item.Value;
    
    double d;
    foreach (var item in dctAdvanceSliders)
    {
        if (!dct.ContainsKey(item.Key))
            continue;
        if (!double.TryParse(dct[item.Key], out d))
            continue;
        item.Value.Value = d;
    }
    bool b;
    foreach (var item in fmtCheckBoxes)
    {
        if (!dct.ContainsKey($"item.Content"))
            continue;
        if (!bool.TryParse(dct[$"item.Content"], out b))
            continue;
        item.IsChecked = b;
    }
}
相应地,加载参数的事件为
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
    var ofd = new OpenFileDialog();
    ofd.Filter = FMT_CFG;
    if (ofd.ShowDialog() != true)
        return;
    try
    {
        loadParaJson(ofd.FileName);
    }
    catch(Exception ex) 
    {
        txtInfo.AppendText($"文件加载失败,原因为{ex.Message}");
    }
}
自动加载配置文件
接下来是希望自动加载参数,这也非常简单,只需先设置一个默认配置文件的路径
const string PARA_PATH = "para.json";
然后在initParaDct的结尾添加下面两行代码
if(File.Exists(PARA_PATH)) loadParaJson(PARA_PATH);
else saveParaJson(PARA_PATH);
表示如果配置文件存在,则加载配置文件,否则将当前参数保存为配置文件。



















