CANoe学习记录-总体文件新建、打开、保存等格式
新建工程
WPF中通过showDialog()弹出一个winform窗体,如果点击确定,则返回OK,WPF新建一个工程,如果点击取消,WPF取消新建工程,如何实现?
winfrom中返回值
private void button1_Click(object sender, EventArgs e)//确定按钮
{
//返回一个确定值,表示新建工程
this.DialogResult = DialogResult.OK;
this.Close();
}
private void button2_Click(object sender, EventArgs e)//取消按钮
{
//返回一个取消值,表示取消新建工程
this.DialogResult = DialogResult.Cancel;
this.Close();
}
WPF获取winfrom的返回值
//工程新建,引导文件
Module module = new Module();
module.ShowDialog();
if (module.DialogResult == System.Windows.Forms.DialogResult.Cancel)
{
return;
}
WinForm禁止调整大小
窗口属性 > FormBorderStyle > 设置为FixedSingle即可
listView单列多项显示
选择List
如何实现,列表选项的默认选择,并且只有当有选项被选择的时候,确认按钮才会处于Enable状态
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
/**
if (listView1.Items[0].Selected == false) {
button1.Enabled = false;
}
else
{
button1.Enabled = true;
}*/
if (listView1.SelectedItems.Count != 0)
{
if (listView1.SelectedItems[0] == null)
{
button1.Enabled = false;
}
else
{
button1.Enabled = true;
}
}
else
{
button1.Enabled = false;
}
}
在电脑目录下创建工程文件
路径选择按钮,采用FolderBrowserDialog,可在textBox2返回文件夹路径(文件名后面为textBox1,文件夹路径后面为textBox2)
private void button3_Click(object sender, EventArgs e)//路径选择按钮
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.ShowDialog();
if (fbd.SelectedPath != string.Empty)
{
textBox2.Text = fbd.SelectedPath;
filepathname = fbd.SelectedPath;
}
}
在指定目录下创建新文件,并向里面写入内容
private void button1_Click(object sender, EventArgs e)//新建按钮
{
//返回一个确定值,表示新建工程
this.DialogResult = DialogResult.OK;
//在指定目录生成工程文件,后缀名.cmn
if (textBox1.Text == "")
{
//如果文件名为空,则不能新建
}
filename = filepathname + "\\" + textBox1.Text;
FileInfo fi = new FileInfo(filename);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
StreamWriter sw = File.CreateText(filename);
sw.WriteLine("孙汉创建的文件");
sw.WriteLine("时间:2019-11-26");
sw.Close();
this.Close();
}
新建的文件,如何添加图案
生成的工程文件是这样的
对比该文件的属性和其他成熟软件生成的文件的属性
每次点击保存时,程序如何进行,采用StreamWriter
using (StreamWriter sw = new StreamWriter(filename))//加入“true”参数表示:以追加的方式写入文件
{
//每次保存重新写入内容
sw.WriteLine("CANManager Version |1|1|1|123456 Configuration1");
sw.WriteLine("Version: 1.0.0 Build 64");
sw.WriteLine("32 PRO");
sw.WriteLine("总视图控件的配置");
sw.WriteLine("");
sw.WriteLine("仿真模块的配置");
sw.WriteLine("");
}
项目退出之前,弹出是否保存框
程序需要记录一些更改,距离上一次手动保存,如果这之间工程没有出现变化,则直接退出,否则会弹出是否保存框,类似于下图所示:
private void window_closing(object sender, System.ComponentModel.CancelEventArgs e)
/**WPF关闭窗口事件触发的函数,对比Closed(Closed是关闭窗口Closing执行后,
仅仅是窗口关闭后所执行的函数并不能取消操作窗口)*/
{
//项目退出之前,会弹出是否保存框
MessageBoxResult dr = MessageBox.Show("程序关闭之前是否需要保存?", "确认", MessageBoxButton.YesNoCancel);
if(dr == MessageBoxResult.Yes)
{
//saveUserOption();保存后再退出
e.Cancel = false;
}
else if (dr == MessageBoxResult.No)
{
//不保存直接退出
e.Cancel = false;
}
else
{
e.Cancel = true;
}
}
程序如何实现快捷键操作,比如Ctrl + S、Ctrl + Z等
StreamReader和StreamWriter的常规操作
打开工程
OpenFileDialog的使用
关于OpenFileDialog用户选择取消按钮
参考链接关于OpenFileDialog用户选择取消按钮
System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
{
return;
}
用StreamReader来读文件内容
//创建完各小窗口后,需要对文件进行解析,并执行相对应的操作
//通过读取的文件,来依次导入data文件和dbc文件
string data = "";
string dbc = "";
StreamReader sr = new StreamReader(dlg.FileName);
string line = sr.ReadLine();
//建立两个正则表达式
Regex regex1 = new Regex("DATA_:");
Regex regex2 = new Regex("DBC_:");
while (line != null)
{
if (line.Length > 5 && line.Substring(0, 5) == "DATA_")//暂时没有使用正则表达式
{
line = sr.ReadLine();
data = line;
}
else if (line.Length > 4 && line.Substring(0, 4) == "DBC_")//regex2.IsMatch(line)
{
line = sr.ReadLine();
dbc = line;
}
else
{
line = sr.ReadLine();
}
}
Console.WriteLine("hhhhhhhhh" + data);
Console.WriteLine("hhhhhhsdas" + dbc);
measurement.DataAdress = data;
simulation.Databases = dbc;
采用正则表达式或字符比配,来获取保存文件中的csv和dbc文件所对应的路径,并将其赋给工程的静态环境变量。
与此同时,还需要将读取的文件信息,例如database数据库文件,添加到simulation的树的database节点之下,另外类似的变化还有很多,需要一一进行软件界面调整。
如何修改WPF的标题栏
在显示YJJ CANManager的同时,在其前方添加,当前所打开文件的目录或者是文件名,方便用户了解当前所处理的文件对象,以免混淆。
Title = Module.filename + " - YJJ CANManager";
此时,更应该考虑左上角的图标如何设置
如何设置WPF左上角ico的图形
保存工程
根据用户体验,和大多数成熟软件进行对比,可以将保存过程细分多种情况
- 每次操作完文件,点击保存按钮,保存一次
- 程序关闭之前,提示用户是否保存
- 另存为保存功能,可实现文件,在指定位置进行保存
- 在已打开文件的基础上,再打开、或者创建一个文件,会提示“上一个工程文件是否需要保存?”
通过MessageBoxResult来弹出窗口,提示用户是否需要对上一个已经打开的文件保存,还是直接退出?
//新建工程之前,需要判断是否已经有其他工程处于打开状态,如果有,需要先关闭当前工程
if (measurement != null)
{
//先弹出是否保存框
//项目退出之前,会弹出是否保存框
MessageBoxResult dr = MessageBox.Show("上一个工程文件是否需要保存?", "YJJ CANManager", MessageBoxButton.YesNo);
if (dr == MessageBoxResult.Yes)
{
workplace_save_click();//saveUserOption();保存后再退出
}
else if (dr == MessageBoxResult.No)
{
//不保存,直接创建新的工程
}
measurement.Dispose();
simulation.Dispose();
write.Dispose();
document.Dispose();
trace.Dispose();
graphics.Dispose();
basicDiagnostics.Dispose();
canStatistics.Dispose();
}
保存代码
private void workplace_save_click()
{
// Create a file to write to.
using (StreamWriter sw = new StreamWriter(Module.filename))//加入“true”参数表示:以追加的方式写入文件
{
//每次保存重新写入内容
sw.WriteLine("CANManager Version |1|1|1|123456 Configuration1");
sw.WriteLine("Version: 1.0.0 Build 64");
sw.WriteLine("32 PRO");
sw.WriteLine("");
sw.WriteLine("");
sw.WriteLine("Part1-------------总视图控件的配置");
sw.WriteLine("");
sw.WriteLine("数据采集处于在线or离线");
sw.WriteLine("状态为(1表示在线,0表示离线)" + ON_OFF_LINE);
sw.WriteLine("");
string path;
if (measurement.DataAdress == null)
{
path = "还没有添加离线数据文件";
}
else
{
path = measurement.DataAdress;
}
sw.WriteLine("DATA_离线数据文件路径为:");
sw.WriteLine(path);
sw.WriteLine("");
sw.WriteLine("数据采集处于simulation还是实车");
sw.WriteLine("模式为:" + BUS_MODE);
sw.WriteLine("");
sw.WriteLine("Part2-------------仿真模块的配置");
sw.WriteLine("");
sw.WriteLine("DBC_文件的保存路径为:");
sw.WriteLine(simulation.Databases);//把各个相关类中我的静态量写到这里,即可
sw.WriteLine("");
sw.WriteLine("CAN网络的名字为:CAN1");
sw.WriteLine("");
sw.WriteLine("新建节点IG模块");
sw.WriteLine("");
sw.WriteLine("新建节点G模块");
}
}