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






4.83/5 (58投票s)
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
的名称。如果将一个键名传递给构造函数,并且loadFromRegistry
为true
,则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
要检查并可能缩短的
pathname
。pathname
应完全解析,并应以驱动器盘符开头或为 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 的修复已被粘贴并测试。干得好,谢谢!