要望を受けた最近使ったファイルを実装したので、その私の方法を解説します。


  • メニュー
フォームの MenuStrip に「最近使ったファイル」項目を用意します。私の場合は多言語に対応してて、デフォルトは英語なので、メニュー項目は英語で「Recently used files」としています。
メニューを用意する
このメニューは recentlyUsedFilesToolStripMenuItem という名前が自動的に付けられました。


  • リストを更新する
次にファイルパスを格納する入れ物を用意します。

public List<string> RecentlyUsedFiles { get; set; }
この RecentlyUsedFiles リストに使用したパス情報を追加していきます。追加するタイミングは、ファイルの読み込みと保存です。ただ、私が気になるのが存在しないファイルパスが残り続ける事でした。そのため、追加や表示のタイミングで、パスの存在確認をしたいなと考えました。そのため、追加時に存在確認をしてなければリストから消すようにします。また、登録最大数も設定して、超えた分は捨てたいと思います。今回は最大50個まてとしています。

//--------------------------------------------------------------- // 最近使ったファイルで存在しないパスを削除する //--------------------------------------------------------------- private static void CheckRecentlyUsedFiles() { for (int idx = RecentlyUsedFiles.Count - 1; idx >= 0; --idx) { if (File.Exists(RecentlyUsedFiles[idx])) continue; RecentlyUsedFiles.RemoveAt(idx); } } //--------------------------------------------------------------- // 最近使ったファイルを追加する //--------------------------------------------------------------- private static void AddRecentlyUsedFiles(string path) { CheckRecentlyUsedFiles(); RecentlyUsedFiles.Remove(path); RecentlyUsedFiles.Insert(0, path); while (RecentlyUsedFiles.Count >= 50) { RecentlyUsedFiles.RemoveAt(RecentlyUsedFiles.Count - 1); } }
この AddRecentlyUsedFiles を読み込みと保存から呼び出すようにします。


  • ドロップメニューの動的追加
最後に表示です。最近使ったファイルは動的に変化していきますから、メニュー項目も動的に変化します。ファイルメニューが開かれるイベントで、先に用意したメニューの DropDownItems にファイルパスを追加します。必要なのはパス名と、Tagにインデックス番号と、選択された時のイベント設定です。また、以前に追加したメニューもクリアしてから追加しないとどんどん増えてしまいますので、それにも対応します。さらに最近使用したファイルがないときは、項目そのものを非表示にしています。

// ------------------------------------------------------------- // ファイルメニューが開かれる // ------------------------------------------------------------- private void FileMenu_DropDownOpening(object sender, EventArgs e) { CheckRecentlyUsedFiles(); if (RecentlyUsedFiles.Any()) { recentlyUsedFilesToolStripMenuItem.Visible = true; // 最近使ったファイルリストを削除 for (int idx = 0; idx < recentlyUsedFilesToolStripMenuItem.DropDownItems.Count; ++idx) { recentlyUsedFilesToolStripMenuItem.DropDownItems[idx].Dispose(); } recentlyUsedFilesToolStripMenuItem.DropDownItems.Clear(); // 最近使ったファイルリストを追加 for (int idx = 0; idx < 10 && idx < RecentlyUsedFiles.Count; ++idx) { ToolStripMenuItem item = new(RecentlyUsedFiles[idx]) { Tag = idx }; item.Click += new EventHandler(RecentlyUsedFilesToolStripMenuItem_Click); recentlyUsedFilesToolStripMenuItem.DropDownItems.Add(item); } } else { recentlyUsedFilesToolStripMenuItem.Visible = false; } } // ------------------------------------------------------------- // ファイル/最近使ったファイル // ------------------------------------------------------------- private void RecentlyUsedFilesToolStripMenuItem_Click(object sender, EventArgs e) { var menu = (ToolStripMenuItem)sender; string path = RecentlyUsedFiles[(int)menu.Tag]; if (LoadProjectFile(path)) { openFile.FileName = path; PrintAppCaption(); } }

最近使ったファイルでの読み込みも最近使ったファイルなので、LoadProjectFile で読み込むときに、パスを最新位置に更新しています。
最近使ったファイル
以上、参考になれば。
※このゲーム、実在してたのか!?