默認ContextMenu不提供此功能。如果你想要這個功能,你應該創建自己的自定義菜單項,也可以使項目的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;
}
同樣使用自定義菜單項類:
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以保持向後兼容和未來的使用。
你能解釋爲什麼不使用ContextMenuStrip? – Asaf
@Asaf我更喜歡舊的ContextMenu的外觀和感覺 – jeff