Как поместить значок в MenuItem

Есть ли способ разместить значок рядом с текстом в 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)?

Любая помощь приветствуется.

Ответ 1

Попробуйте использовать ContextMenuStrip и добавьте в него ToolStripMenuItems.

Если вам нужно использовать MenuItem, вам нужно будет сделать это через событие DrawItem с свойством OwnerDraw, установленным в true.

Ответ 2

Это было исправлено 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));

Ответ 3

Если вы привязаны к 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,
});

Надеюсь, что это поможет.

Ответ 4

Используйте элемент управления ContextMenuStrip, в котором вы можете сделать это либо в дизайнере, нажав на элемент и выбрав "Установить изображение...", либо программно, изменив свойство Image ToolStripMenuItem.