如何在MenuItem中放置一个图标

时间:2011-07-08 11:19:07

标签: c# .net winforms .net-2.0

有没有办法在MenuItem中的文本旁边添加一个图标?

当用户右键单击用户控件时,我使用以下代码显示弹出菜单:

 ContextMenu menu = new ContextMenu();
 MenuItem item = new MenuItem("test", OnClick);
 menu.MenuItems.Add(item);
 menu.Show(this, this.PointToClient(MousePosition));

我想在弹出菜单中的“test”字符串左侧放置一个图标,以便用户更容易识别它。有没有办法做到这一点,除了将OwnerDraw属性设置为true(因此要求我自己完全绘制菜单项,就像在这个示例中完成的那样:http://www.codeproject.com/KB/menus/cs_menus.aspx)?

感谢任何帮助。

4 个答案:

答案 0 :(得分:18)

尝试使用ContextMenuStrip并向其添加ToolStripMenuItems。

如果必须使用MenuItem,则必须通过DrawItem事件并将OwnerDraw属性设置为true来执行此操作。

答案 1 :(得分:9)

这是在6年前使用.NET 2.0版本修复的。它获得了ToolStrip类。代码非常相似:

        var menu = new ContextMenuStrip();
        var item = new ToolStripMenuItem("test");
        item.Image = Properties.Resources.Example;
        item.Click += OnClick;
        menu.Items.Add(item);
        menu.Show(this, this.PointToClient(MousePosition));

答案 2 :(得分:4)

如果您与MenuItem绑定,那么我发现解决方案就像这样:

var dropDownButton = new ToolBarButton();
dropDownButton.ImageIndex = 0;
dropDownButton.Style = ToolBarButtonStyle.DropDownButton;

var mniZero = new MenuItem( "Zero", (o, e) => DoZero() );
mniZero.OwnerDraw = true;
mniZero.DrawItem += delegate(object sender, DrawItemEventArgs e) {
    double factor = (double) e.Bounds.Height / zeroIconBmp.Height;
    var rect = new Rectangle( e.Bounds.X, e.Bounds.Y,
                         (int) ( zeroIconBmp.Width * factor ),
                         (int) ( zeroIconBmp.Height * factor ) );
    e.Graphics.DrawImage( zeroIconBmp, rect );
};

var mniOne = new MenuItem( "One", (o, e) => DoOne() );
mniOne.OwnerDraw = true;
mniOne.DrawItem += delegate(object sender, DrawItemEventArgs e) {
    double factor = (double) e.Bounds.Height / oneIconBmp.Height;
    var rect = new Rectangle( e.Bounds.X, e.Bounds.Y,
                     (int) ( oneIconBmp.Width * factor ),
                     (int) ( oneIconBmp.Height * factor ) );
    e.Graphics.DrawImage( oneIconBmp, rect );
};

dropDownButton.DropDownMenu = new ContextMenu( new MenuItem[]{
    mniZero, mniOne,
});

希望这有帮助。

答案 3 :(得分:1)

使用ContextMenuStrip控件,您可以在设计器中执行该操作,方法是单击项目并选择“Set image ...”,或者通过更改ToolStripMenuItem的Image属性以编程方式执行。