C# 如何以最简单的方式在V 2010Express C中创建MRU?

C# 如何以最简单的方式在V 2010Express C中创建MRU?,c#,.net,registry,visual-studio-express,C#,.net,Registry,Visual Studio Express,首先,我是C#编程的新手,我需要尽快创建一个简单的MRU 问题是我试着看了一些网上的例子,但是我发现它们太让人困惑了 那么,任何人都可以在toolstripmenuitem中创建一个“最近使用的”部分,而无需进入那些复杂的代码吗 我将无法理解这些东西 注册表项: KEY_CURRENT_USER\Software\Microsoft\VCExpress\9.0\FileMRUList 代码: 我只需要下面链接中所示的简单内容,所以您想创建一个子菜单,如屏幕截图中所示?为此,您必须: 将最近使

首先,我是C#编程的新手,我需要尽快创建一个简单的MRU

问题是我试着看了一些网上的例子,但是我发现它们太让人困惑了

那么,任何人都可以在toolstripmenuitem中创建一个“最近使用的”部分,而无需进入那些复杂的代码吗

我将无法理解这些东西

注册表项:

KEY_CURRENT_USER\Software\Microsoft\VCExpress\9.0\FileMRUList
代码:


我只需要下面链接中所示的简单内容,所以您想创建一个子菜单,如屏幕截图中所示?为此,您必须:

  • 将最近使用的文件列表存储在某个位置。这可能是注册表,也可能只是一个简单的文本文件,我现在要做的就是保持简单
  • 了解如何在运行时而不是在设计器中生成菜单项
1.将MRU存储在一个文件中 您可能已经声明了一个私有字段来包含您的MRU,对吗

private List<string> _mru = new List<string>();
_mru.Insert(0, fullFilePath);
现在,当然,当应用程序关闭时,您需要将此MRU保存到一个文件中。让我们在表单的FormClosed事件中这样做。双击属性中的FormClosed事件,并编写一些类似以下内容的代码:

var appDataPath = Application.UserAppDataPath;
var myAppDataPath = Path.Combine(appDataPath, "MyApplication");
var mruFilePath = Path.Combine(myAppDataPath, "MRU.txt");
File.WriteAllLines(mruFilePath, _mru);
现在,我们已将MRU保存在一个文件中。现在很明显,当应用程序启动时,我们需要再次加载它,所以在表单的加载事件中执行如下操作:

2.创建菜单项 既然
\u mru
包含了我们想要在菜单中显示的文件路径,我们需要为每个文件创建一个新的菜单项。在这里,我假设您在“文件”菜单中已经有一个菜单项(在屏幕截图中称为“最近使用的”菜单项),它被称为
mnuRecentlyUsed
,并且我们只需要创建子项:

foreach (var path in _mru)
{
    var item = new ToolStripMenuItem(path);
    item.Tag = path;
    item.Click += OpenRecentFile;
    mnuRecentlyUsed.DropDownItems.Add(item);
}
现在我们所需要的就是实际打开一个文件的方法,我称之为
OpenRecentFile

void OpenRecentFile(object sender, EventArgs e)
{
    var menuItem = (ToolStripMenuItem) sender;
    var filepath = (string) menuItem.Tag;

    // Proceed to open the file
    // ...
}
免责声明 请不要使用此代码,除非您理解它,并且您确信它是按照您的意图编写的。如果它需要做一些稍微不同的事情,我相信您可以自己进行必要的更改

另外,我相信您会注意到,在程序运行时,上面的内容不会更新子菜单。如果您了解上述代码的工作原理,那么我相信您将能够自己解决其余的问题。


这个项目正是您想要的

嗨,Timwi,我想和您确认一下,您是否可以不使用您现在正在使用的c#语言的生成??因为我不太熟悉这个版本,或者如果我错了,我没有使用“var”来声明变量,也没有在声明的字段前面使用任何带下划线的“35;”,到目前为止,我想……我真的很了解C#。如果你不想使用
var
,就用类型替换它吧。例如,
var filepath=(string)menuItem.Tag
stringfilepath=(string)menuItem.Tag完全相同。如果不确定变量的类型,只需将鼠标悬停在其上即可。其次,下划线只是名称的一部分。如果你不想要它,就把它拿走。我只使用它来区分字段和局部变量,但你不必这样做。嗨,我已经通读了你给我的指南,我意识到,_mru.InsertAt(0,fullFilePath);应该是mru.Insert(0,fullFilePath);相反,我这样说对吗??因为如果我使用Insert,它不会给我任何问题。至于OpenRecentFile(),我是否像openFileDialog一样使用open方法?它应该是
File.writeAllines(mruFilePath,_mru.ToArray())@ajeh:只有当你被困在古老的.NET3.5上时。
foreach (var path in _mru)
{
    var item = new ToolStripMenuItem(path);
    item.Tag = path;
    item.Click += OpenRecentFile;
    mnuRecentlyUsed.DropDownItems.Add(item);
}
void OpenRecentFile(object sender, EventArgs e)
{
    var menuItem = (ToolStripMenuItem) sender;
    var filepath = (string) menuItem.Tag;

    // Proceed to open the file
    // ...
}