在我們一些和文件處理打交道的系統(tǒng)中顶掉,我們往往需要記錄下最近使用的文件梗夸,這樣方便用戶快速打開(kāi)之前瀏覽或者編輯過(guò)的文件丘跌,這種在很多軟件上很常見(jiàn)殴瘦,本文主要介紹在Winform界面菜單中實(shí)現(xiàn)【最近使用的文件】動(dòng)態(tài)菜單的處理狠角,實(shí)現(xiàn)一個(gè)較為常用的功能。
在我上篇隨筆《文字處理控件TX Text Control的使用》介紹的內(nèi)容中蚪腋,我針對(duì)性的對(duì)這個(gè)控件的使用做了一個(gè)全面的了解丰歌,發(fā)現(xiàn)其中案例代碼總這部分的功能實(shí)現(xiàn)【最近使用的文件】挺好姨蟋,于是把它進(jìn)行了整理,把整個(gè)思路作為一篇隨筆進(jìn)行記錄立帖,希望對(duì)大家有所幫助眼溶。
1、菜單動(dòng)態(tài)加入【最近使用的文件】的介紹
這個(gè)功能我們?cè)诤芏喑绦蛏嫌幸?jiàn)過(guò)晓勇,如在Visual Studio里面堂飞,我們可以看到這個(gè)列表的動(dòng)態(tài)處理。
以及在Word工具欄里面绑咱,一樣有這樣的實(shí)現(xiàn)
這個(gè)功能主要的處理邏輯就是绰筛,我們?cè)诖蜷_(kāi)文件、保存文件描融、或者另存為其他文件的時(shí)候铝噩,把對(duì)應(yīng)的文件路徑進(jìn)行記錄存儲(chǔ),當(dāng)我們打開(kāi)這個(gè)菜單的時(shí)候窿克,把它們進(jìn)行加載動(dòng)態(tài)生成相關(guān)的菜單即可骏庸,一旦我們選擇其中一個(gè)文件,我們就把它們加載到主界面進(jìn)行展示或者編輯即可年叮。
2具被、菜單動(dòng)態(tài)加入【最近使用的文件】的實(shí)現(xiàn)
1)設(shè)計(jì)處理過(guò)程
首先我們需要在界面里面添加一個(gè) 菜單的占位符,方便我們以此為基準(zhǔn)只损,加入對(duì)應(yīng)的動(dòng)態(tài)菜單一姿,如下設(shè)計(jì)界面所示
剩下的就是代碼的處理了,我們剛才提到改执,我們需要記錄文件打開(kāi)啸蜜,保存、另存為的幾個(gè)操作的文件辈挂,然后存儲(chǔ)起來(lái)使用,也就是存儲(chǔ)一個(gè)文件路徑和文件標(biāo)題列表了裹粤。
這個(gè)存儲(chǔ)我們可以通過(guò)系統(tǒng)配置文件的常規(guī)處理實(shí)現(xiàn)终蒂,先在程序項(xiàng)目解決方案里面找到對(duì)應(yīng)的Settigns.settings文件,打開(kāi)后進(jìn)行添加記錄對(duì)象處理遥诉,如下所示拇泣。
有了這些,那么我們的信息存儲(chǔ)就實(shí)現(xiàn)了第一步了矮锈,需要的就是把它們通過(guò)代碼進(jìn)行管理起來(lái)霉翔。
2)代碼實(shí)現(xiàn)處理過(guò)程
有了上面的設(shè)計(jì)處理過(guò)程,我們有了一個(gè)固定的菜單可以使用苞笨,有了一個(gè)配置對(duì)象以及對(duì)應(yīng)的屬性可以存儲(chǔ)和加載處理债朵,那么剩下的就是通過(guò)代碼把它們之間的關(guān)系聯(lián)系起來(lái)子眶,實(shí)現(xiàn)動(dòng)態(tài)文件列表的菜單處理即可。
我們定義一個(gè)類(lèi)序芦,并添加對(duì)應(yīng)的文件數(shù)量大小和文件列表的屬性臭杰,用來(lái)記錄和配置文件定義的屬性內(nèi)容,以及存儲(chǔ)對(duì)應(yīng)的菜單項(xiàng)對(duì)象谚中,如下所示渴杆。
其中我們需要在文件打開(kāi),保存宪塔、另存的時(shí)候磁奖,做一個(gè)文件列表的記錄處理,因此需要增加一個(gè)函數(shù)某筐,用來(lái)把最近的文件追加到列表的頂端(最近文件列表)比搭,以及裁剪多于指定數(shù)量的記錄,具體操作如下所示来吩。
/// <summary>
/// 添加新文件路徑到頂部列表(在打開(kāi)敢辩、保存、另存為操作中)
/// </summary>
public void AddRecentFile(string filePath)
{
_fileList.Insert(0, filePath);
//從最后位置開(kāi)始倒著找弟疆,如果找到一致名稱(chēng)戚长,則移除舊記錄
for (int i = _fileList.Count - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (_fileList[i] == _fileList[j])
{
_fileList.RemoveAt(i);
break;
}
}
}
//最后,僅保留指定的文件列表數(shù)量
for (int bynd = _fileList.Count - 1; bynd > _nMaxFiles - 1; bynd--)
{
_fileList.RemoveAt(bynd);
}
UpdateMenu();
}
動(dòng)態(tài)增加菜單的處理怠苔,就是根據(jù)這些文件列表進(jìn)行的菜單項(xiàng)處理同廉,先清空舊的記錄,然后添加新紀(jì)錄柑司,并添加對(duì)應(yīng)給的事件處理即可迫肖。
其中增加一個(gè)【清空列表】的維護(hù)性操作。
當(dāng)然攒驰,文件的打開(kāi)蟆湖,我們最好用一個(gè)狀態(tài)記錄文件是否編輯過(guò),如果編輯過(guò)則應(yīng)該提示用戶是否保存原來(lái)的文件玻粪。
/// <summary>
/// 最近文件法的菜單項(xiàng)
/// </summary>
void menuItem_Click(object sender, EventArgs e)
{
if (_bDocumentDirty)
{
var result = MessageBox.Show("需要保存到 " + DocumentFileName + "嗎?", "提示", MessageBoxButtons.YesNoCancel);
if (result == DialogResult.Yes)
{
FileSave();
}
}
ToolStripMenuItem item = (ToolStripMenuItem)sender;
int pos = item.GetCurrentParent().Items.IndexOf(item);
if (pos >= 0 && pos < _fileList.Count)
{
DocumentFileName = item.Tag.ToString();
FileOpen();
}
}
/// <summary>
/// 清空最近菜單列表的菜單項(xiàng)
/// </summary>
void clearListItem_Click(object sender, EventArgs e)
{
_fileList.Clear();
UpdateMenu();
}
其中的菜單項(xiàng)入口隅津,我們應(yīng)該在主程序初始化后把對(duì)應(yīng)的菜單項(xiàng)賦值給輔助類(lèi)即可。
//指定【最近使用的文件】的菜單項(xiàng)劲室,方便對(duì)文檔列表菜單進(jìn)行動(dòng)態(tài)創(chuàng)建
_fileHandler.RecentFilesMenu = this.menuFile_RecentFiles;
整個(gè)過(guò)程在此基本完成了伦仍,最后我們看看實(shí)際的效果,符合我們的預(yù)期很洋。