文章目录
- 系统参数字典
- 加载参数
- 自动加载配置文件
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);
表示如果配置文件存在,则加载配置文件,否则将当前参数保存为配置文件。