在Winform界面菜單中實(shí)現(xiàn)動(dòng)態(tài)增加【最近使用的文件】菜單項(xiàng)

在我們一些和文件處理打交道的系統(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ù)期很洋。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末充蓝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓苟,老刑警劉巖官脓,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異娜谊,居然都是意外死亡确买,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)纱皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)湾趾,“玉大人,你說(shuō)我怎么就攤上這事派草〔蟛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵近迁,是天一觀的道長(zhǎng)艺普。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鉴竭,這世上最難降的妖魔是什么歧譬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮搏存,結(jié)果婚禮上瑰步,老公的妹妹穿的比我還像新娘。我一直安慰自己璧眠,他們只是感情好缩焦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著责静,像睡著了一般袁滥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灾螃,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天题翻,我揣著相機(jī)與錄音,去河邊找鬼腰鬼。 笑死藐握,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垃喊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袜炕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼本谜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起偎窘,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乌助,失蹤者是張志新(化名)和其女友劉穎溜在,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體他托,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掖肋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赏参。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片志笼。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖把篓,靈堂內(nèi)的尸體忽然破棺而出纫溃,到底是詐尸還是另有隱情,我是刑警寧澤韧掩,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布紊浩,位于F島的核電站,受9級(jí)特大地震影響疗锐,放射性物質(zhì)發(fā)生泄漏坊谁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一滑臊、第九天 我趴在偏房一處隱蔽的房頂上張望口芍。 院中可真熱鬧,春花似錦简珠、人聲如沸阶界。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膘融。三九已至,卻和暖如春祭玉,著一層夾襖步出監(jiān)牢的瞬間氧映,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工脱货, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岛都,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓振峻,卻偏偏與公主長(zhǎng)得像臼疫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扣孟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容