我需要在 Winform 应用程序中使用 ContextMenu。请注意它必须是 ContextMenu 而不是 ContextMenuStrip。ContextMenu 的问题是我没有看到任何方法或属性来设置字体并在 MenuItem 旁边显示图像/图标,这在 ContextMenuStrip 的情况下很容易。
是否可以在 ContextMenu 的 MenuItem 旁边设置字体并显示图像/图标?
默认 ContextMenu 不提供此功能。如果您想要此功能,您应该创建自己的自定义 MenuItem,或者您可以启用项目的OwnerDraw模式并在DrawItem事件处理程序中进行手动绘制:
var item = new MenuItem("foo");
item.OwnerDraw = true;
item.DrawItem += item_DrawItem;
顺便说一句,您还需要处理 MeasureItem 事件以提供您将手动绘制的项目的大小。例如创建斜体字体
void item_MeasureItem(object sender, MeasureItemEventArgs e)
{
var item = (MenuItem)sender;
var g = e.Graphics;
Font font = new Font("Arial", 10, FontStyle.Italic);
e.ItemWidth = 200;
var size = g.MeasureString(item.Text, font, e.ItemWidth);
e.ItemHeight = (int)size.Height;
}
void item_DrawItem(object sender, DrawItemEventArgs e)
{
var item = (MenuItem)sender;
var g = e.Graphics;
var font = new Font("Arial", 10, FontStyle.Italic);
var brush = new SolidBrush(e.ForeColor);
g.DrawString(item.Text, font, brush, e.Bounds.X, e.Bounds.Y);
}
并添加项目:
ContextMenu = new ContextMenu(new []{new MenuItem("foo"), new MenuItem("bar")});
foreach (MenuItem item in ContextMenu.MenuItems)
{
item.OwnerDraw = true;
item.MeasureItem += item_MeasureItem;
item.DrawItem += item_DrawItem;
}
与自定义 MenuItem 类相同:
public class MenuItemWithItalicFont : MenuItem
{
private Font font;
public MenuItemWithItalicFont(string text)
: base(text)
{
OwnerDraw = true;
font = new Font("Arial", 10, FontStyle.Italic);
}
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
var g = e.Graphics;
e.ItemWidth = 200;
var size = g.MeasureString(Text, font, e.ItemWidth);
e.ItemHeight = (int)size.Height;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
var g = e.Graphics;
var brush = new SolidBrush(e.ForeColor);
g.DrawString(Text, font, brush, e.Bounds.X, e.Bounds.Y);
}
}
添加项目:
ContextMenu = new ContextMenu(new []{
new MenuItemWithItalicFont("foo"),
new MenuItemWithItalicFont("bar")});
注意实际上 ContextMenu 已被 ContextMenuStrip 控件取代,如果您需要此功能,则应使用新控件。旧的 ContextMenu 仍然存在,主要是为了向后兼容。MSDN:
如果您选择,则保留 ContextMenu 以供向后兼容和将来使用。