在Winform界面菜單中實現動態增長【最近使用的文件】菜單項

在咱們一些和文件處理打交道的系統中,咱們每每須要記錄下最近使用的文件,這樣方便用戶快速打開以前瀏覽或者編輯過的文件,這種在不少軟件上很常見,本文主要介紹在Winform界面菜單中實現【最近使用的文件】動態菜單的處理,實現一個較爲經常使用的功能。html

在我上篇隨筆《文字處理控件TX Text Control的使用》介紹的內容中,我針對性的對這個控件的使用作了一個全面的瞭解,發現其中案例代碼總這部分的功能實現【最近使用的文件】挺好,因而把它進行了整理,把整個思路做爲一篇隨筆進行記錄,但願對你們有所幫助。函數

一、菜單動態加入【最近使用的文件】的介紹

這個功能咱們在不少程序上有見過,如在Visual  Studio裏面,咱們能夠看到這個列表的動態處理。工具

以及在Word工具欄裏面,同樣有這樣的實現this

這個功能主要的處理邏輯就是,咱們在打開文件、保存文件、或者另存爲其餘文件的時候,把對應的文件路徑進行記錄存儲,當咱們打開這個菜單的時候,把它們進行加載動態生成相關的菜單便可,一旦咱們選擇其中一個文件,咱們就把它們加載到主界面進行展現或者編輯便可。spa

 

二、菜單動態加入【最近使用的文件】的實現

1)設計處理過程

首先咱們須要在界面裏面添加一個 菜單的佔位符,方便咱們以此爲基準,加入對應的動態菜單,以下設計界面所示設計

剩下的就是代碼的處理了,咱們剛纔提到,咱們須要記錄文件打開,保存、另存爲的幾個操做的文件,而後存儲起來使用,也就是存儲一個文件路徑和文件標題列表了。code

這個存儲咱們能夠經過系統配置文件的常規處理實現,先在程序項目解決方案裏面找到對應的Settigns.settings文件,打開後進行添加記錄對象處理,以下所示。orm

有了這些,那麼咱們的信息存儲就實現了第一步了,須要的就是把它們經過代碼進行管理起來。htm

 

2)代碼實現處理過程

有了上面的設計處理過程,咱們有了一個固定的菜單可使用,有了一個配置對象以及對應的屬性能夠存儲和加載處理,那麼剩下的就是經過代碼把它們之間的關係聯繫起來,實現動態文件列表的菜單處理便可。對象

咱們定義一個類,並添加對應的文件數量大小和文件列表的屬性,用來記錄和配置文件定義的屬性內容,以及存儲對應的菜單項對象,以下所示。

其中咱們須要在文件打開,保存、另存的時候,作一個文件列表的記錄處理,所以須要增長一個函數,用來把最近的文件追加到列表的頂端(最近文件列表),以及裁剪多於指定數量的記錄,具體操做以下所示。

/// <summary>
/// 添加新文件路徑到頂部列表(在打開、保存、另存爲操做中)
/// </summary>
public void AddRecentFile(string filePath)
{
    _fileList.Insert(0, filePath);

    //從最後位置開始倒着找,若是找到一致名稱,則移除舊記錄
    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;
            }
        }
    }

    //最後,僅保留指定的文件列表數量
    for (int bynd = _fileList.Count - 1; bynd > _nMaxFiles - 1; bynd--)
    {
        _fileList.RemoveAt(bynd);
    }

    UpdateMenu();
}

動態增長菜單的處理,就是根據這些文件列表進行的菜單項處理,先清空舊的記錄,而後添加新紀錄,並添加對應給的事件處理便可。

其中增長一個【清空列表】的維護性操做。

固然,文件的打開,咱們最好用一個狀態記錄文件是否編輯過,若是編輯過則應該提示用戶是否保存原來的文件。

/// <summary>
/// 最近文件法的菜單項
/// </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>
/// 清空最近菜單列表的菜單項
/// </summary>
void clearListItem_Click(object sender, EventArgs e)
{
    _fileList.Clear();
    UpdateMenu();
}

其中的菜單項入口,咱們應該在主程序初始化後把對應的菜單項賦值給輔助類便可。

//指定【最近使用的文件】的菜單項,方便對文檔列表菜單進行動態建立
_fileHandler.RecentFilesMenu = this.menuFile_RecentFiles;

整個過程在此基本完成了,最後咱們看看實際的效果,符合咱們的預期。

相關文章
相關標籤/搜索