带顶部 5 收藏功能的字体 ListBox 和 ComboBox 控件






3.38/5 (7投票s)
2005年6月17日
2分钟阅读

59401

836
这些控件显示已安装的字体列表,并以实际字体显示它们。它还具有类似于 Office 的前 5 个最喜爱功能。
引言
此控件复制了 Office 字体下拉框,具有显示您最近选择的五个最喜爱字体的功能。
背景
我最初将此控件作为 ListBox 控件启动,在克服了几个问题后,我通过一次性复制大部分代码在几分钟内将其转换为 ComboBox。一个价钱,两个控件!
使用代码
只有一个属性真正需要设置,那就是 Image
设置。此图像是软件包中包含的 TT,TrueType 图像 - 这实际上是一种变通方法,因为我没有时间(可以理解为:懒得)让资源管理器在 VS 2003 中正常工作,但在 VS 2005 中它很简单。您还有 MaximumFavourites
属性,用于设置要在“最喜爱”部分中显示的字体数量,默认为 5。还有一个 NonReadableFonts
,它只是我在我的电脑上找到的不显示可读文本的字体列表,您可以随时添加您的字体。
fontListBox1.MaximumFavourites = 5;
fontListBox1.NonReadableFonts = new string[] {
"Webdings",
"Wingdings",
"Wingdings 2",
"Wingdings 3"};
关注点
该死的,这段代码太棘手了,试图让最喜爱的功能正常工作,但是当控件完成后,我回头看了一下,它似乎很简单,只是了解逻辑的问题。
我有一个集合,其中包含一个最喜爱字体列表,该列表在 OnSelectedIndexChanged
事件中更新。它会查看新选择的字体是否在“最喜爱”列表中,如果在,则将其移动到列表顶部,如果不在,则将其添加进去,如果计数超过最大限制,则删除其他最喜爱字体。
protected override void OnSelectedIndexChanged(EventArgs e)
{
base.OnSelectedIndexChanged(e);
string fontName = this.Text;
if (fontName == "") { return; }
int indexOf = favourites.IndexOf(fontName);
if (indexOf == -1)
{
if (maxFavourites > favourites.Count)
{
// Insert new
favourites.Insert(0, fontName);
this.Items.Insert(0, fontName);
}
else
{
// Don't add any new fonts - replace instead
favourites.RemoveAt(maxFavourites - 1);
favourites.Insert(0, fontName);
this.Items.RemoveAt(maxFavourites - 1);
this.Items.Insert(0, fontName);
}
}
else
{
// Move existing arount
if (favourites.Count > 1)
{
favourites.RemoveAt(indexOf);
favourites.Insert(0, fontName);
this.Items.RemoveAt(indexOf);
this.Items.Insert(0, fontName);
}
}
this.EndUpdate();
}
如果字体不可读,那么我使用 Tahoma 作为默认字体来书写名称,然后尝试以其实际字体类型书写字体名称,通常显示图像。
ListBox 或 ComboBox 中的 ItemHeight
在该值上加了 3,以允许绘制“最喜爱”分隔符,否则文本将在底部被剪切。
已知问题
由于设计器总是在设计时获取字体,因此 Items
集合会越来越大! 因此,我进行了一些破解,使设计模式在这种情况下可以工作(因为我没有使用 ComponentModel
,所以设计模式将无法工作),并且在控件实际在运行时运行之前不生成字体列表。
选择添加到“最喜爱”部分的字体意味着选择框不太正确。 此外,选择字体不会将您返回到列表的顶部。
历史
- 上传了 Visual Studio 2005 Beta 2 - 2005 年 6 月 17 日。
- 上传了 Visual Studio 2003 - 2005 年 6 月 17 日。