65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中 .NET 2.0 的最近使用 (MRU) 菜单类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (58投票s)

2005年10月3日

CPOL

7分钟阅读

viewsIcon

230941

downloadIcon

5109

C# 中 .NET 2.0 的最近使用文件类

引言

几年前,我编写了代码和一篇文章,用于实现 .NET 1.1 的最近使用文件类。Visual Studio 2005 和 .NET 2.0 引入了 MenuStrip 类。不幸的是,它们仍然忘记添加 MRU 列表,所以我修改了我的原始代码。我曾考虑过将新项目添加到那个项目中,但最终决定最好将其作为一篇独立的文章,因为之前的类现在已经过时了。

原始文章可以在这里找到。

MruStripMenu 类

MruStripMenu 类在弹出菜单中显示最近使用的文件列表。派生类 MruStripMenuInline 将它们作为菜单中的附加条目或内联方式显示。在这两种情况下,文件左侧都会显示一个数字。条目 1-10 允许您使用键盘上的数字选择一个条目。

命名空间

这个类位于一个名字富有创意的命名空间 JWC (Joe Woodbury Classes) 中。

构造函数

MruStripMenu(ToolStripMenuItem recentFileMenuItem, 
    ClickedHandler clickedHandler)
MruStripMenu(ToolStripMenuItem recentFileMenuItem, 
    ClickedHandler clickedHandler, int maxEntries)
MruStripMenu(ToolStripMenuItem recentFileMenuItem, 
    ClickedHandler clickedHandler, string registryKeyName)
MruStripMenu(ToolStripMenuItem recentFileMenuItem, 
    ClickedHandler clickedHandler, string registryKeyName, int maxEntries)
MruStripMenu(ToolStripMenuItem recentFileMenuItem, 
    ClickedHandler clickedHandler, string registryKeyName, 
    bool loadFromRegistry)
MruStripMenu(ToolStripMenuItem recentFileMenuItem, 
    ClickedHandler clickedHandler, string registryKeyName, 
    bool loadFromRegistry, int maxEntries)
  • recentFileMenuItem

    这是将作为 MRU 列表锚点的菜单项。在创建 MruMenu 实例之前,必须先创建它并将其插入菜单中所需的位置。

  • clickedHandler

    选择 MRU 条目之一时将调用的委托。条目号(从零开始)和文件名将传递给处理程序。

  • registryKeyName

    将用于加载和/或存储 MRU 列表内容的注册表项 MruMenu 的名称。如果将一个键名传递给构造函数,并且 loadFromRegistrytrue,则 MruMenu 将尝试从注册表加载文件。但是,要保存 MRU 列表,您必须调用 SaveToRegistry()

  • loadFromRegistry

    如果为 true,则 MruMenu 将尝试加载存储在传递的注册表项中的 MRU 列表。如果注册表项不存在,则不会引发异常。

  • maxEntries

    MRU 列表中允许的最大条目数。目前,出于实际原因,条目数限制为 4 到 16。如果 _maxEntries 不在此范围内,它将向上或向下调整,以适应(不会抛出 ArgumentOutOfRangeException)。

委托(Delegates)

  • public delegate void ClickedHandler(int number, string filename)
    • number - 被点击条目的 MRU 相对数字
    • filename - 被点击条目的文件名

属性

  • ToolStripItemCollection MenuItems (只读)

    MRU 列表所在的 ToolStripItemCollection

  • int StartIndex (只读)

    第一个 MRU 条目的菜单索引。

  • int EndIndex (只读)

    最后一个 MRU 条目“之后”的菜单索引。

  • int NumEntries (只读)

    当前 MRU 条目数。

  • int MaxEntries (读/写)

    允许的最大 MRU 条目数。您可以将 MaxEntries 设置为 4 到 16 的范围。如果新的最大条目数小于当前条目数,则最旧的条目将被丢弃。

  • int MaxShortenPathLength (读/写)

    菜单中允许的路径的最大长度,以字符为单位。设置时,任何小于 16 的值都将更改为 16。新长度对菜单的当前内容没有影响。

  • string RegistryKeyName (读/写)

    设置/获取 MRU 列表将加载/保存到的注册表项名称。未进行错误检查以验证键是否有效。

静态方法

static string FixupEntryname(int number, string entryname)

将条目编号前缀和助记符(对于 0-9 条目)添加到文件名。请注意,编号是从零开始的,而实际显示的编号是从一开始的。

  • number

    用于前缀的 MRU 相对数字

  • entryname

    要应用前缀的字符串。

static String ShortenPathname(string pathname, int maxLength)

如果 pathname 长于 maxLength,它会用省略号替换连续的路径组件。它将始终保留路径的根和文件名的至少三个字符,这可能导致结果长于 maxLength

  • pathname

    要检查并可能缩短的 pathnamepathname 应完全解析,并应以驱动器盘符开头或为 UNC 路径。

  • maxLength

    结果路径的最大长度,以字符为单位。

方法

int FindFilenameNumber(string filename)

查找与 filename 匹配的条目的 MRU 相对编号。此匹配必须精确,不区分大小写。

如果找不到匹配的条目,则返回 -1。

  • 文件名

    要查找的文件名

int FindFilenameMenuIndex(string filename)

查找与 filename 匹配的条目的菜单索引。此匹配必须精确,不区分大小写。

如果找不到匹配的条目,则返回 -1。

  • 文件名

    要查找的文件名

int GetMenuIndex(int number)

返回 MRU 相对数字处条目的菜单索引。

  • number

    菜单索引的 MRU 相对数字

string GetFileAt(int number)

返回存储在 MRU 相对数字处的文件名。

  • number

    要移除的文件名的 MRU 相对数字。请注意,此数字是从零开始的,而显示是从一开始的。

string[] GetFiles()

返回 MRU 列表中的文件列表。最近的文件将位于索引零。

void SetFiles(String[] filenames)

filenames 替换 MRU 条目。(功能上等同于:RemoveAll(); AddFiles(filenames);)。添加 filenames 时,数组中的第一个字符串将是 MRU 列表中最顶部的。(换句话说,条目将从末尾到开头添加。)

  • filenames

    要设置的文件名列表。

void SetFirstFile(int number)

使指定条目成为 MRU 列表中的第一个。

  • number

    要作为第一个条目的 MRU 相对数字。请注意,此数字是从零开始的,而显示是从一开始的。

void AddFiles(String[] filenames)

filenames 添加到文件列表中。添加 filenames 时,数组中的第一个字符串将是 MRU 列表中最顶部的。(换句话说,条目将从末尾到开头添加。)

  • filenames

    要添加的文件名列表。

void AddFile(String filename)

filename 添加到 MRU 列表中。如果条目存在,它将被移动到第一个位置。否则,它将被添加到第一个位置。如果条目数超过 maxEntries,则最近的文件(最后一个)将被删除。

在添加之前,filename 将首先解析为绝对路径。然后结果将传递给 ShortenPathname 函数。尽管进行了绝对路径解析,但仍可能存在多个条目引用同一个物理文件的情况。

  • 文件名

    要添加的文件名

void AddFile(String filename, String entryname)

entryname 添加到 MRU 列表,并将 filename 存储在该条目中。如果条目存在,它将被移动到第一个位置。否则,它将被添加到第一个位置。如果条目数超过 maxEntries,则最近的文件(最后一个)将被删除。请注意,filename 将用于确定条目是否存在。因此,MRU 列表中可能存在两个相同的条目,即使关联的 filenames 不同。

  • 文件名

    要添加的文件名

  • entryname

    要在 MRU 菜单中使用的文本。

void RemoveFile(int number)

删除 MRU 相对数字处的条目。

  • number

    要移除的条目的 MRU 相对数字。请注意,此数字是从零开始的,而显示是从一开始的。

void RemoveFile(String filename)

移除与 filename 相关联的条目。

  • 文件名

    要移除的文件名

void RemoveAll()

移除所有 MRU 条目。

void LoadFromRegistry(String keyName)

设置注册表项并加载该项中位于的条目。

  • keyName

    从中恢复 MRU 条目的注册表项。

void LoadFromRegistry()

加载存储键中位于的条目。

void SaveToRegistry(String keyName)

设置注册表项并将条目保存到该项。

  • keyName

    存储 MRU 条目的注册表项。

void SaveToRegistry()

保存存储键中位于的条目。

变更

2005 年 9 月 24 日

  • 发布于 CodeProject

2007 年 10 月 16 日

  • 修复了 FixupPrefixes 中的一个错误,该错误导致第一个字符被剥离(感谢 shostakovich55 的发现及其优雅的解决方案)
  • 构造函数现在调用属性来设置 MaxEntries,该属性会进行范围检查

2009 年 11 月 5 日

  • 修复了 Mark Rice 首次发现、我忽略、然后 hgy 验证的 RemoveAll 错误。我向所有人致歉。hgy 的修复已被粘贴并测试。干得好,谢谢!
© . All rights reserved.