Как поместить значок в MenuItem - PullRequest
15 голосов
/ 08 июля 2011

Есть ли способ поместить значок рядом с текстом в MenuItem?

Я использую следующий код для отображения всплывающего меню, когда пользователь щелкает правой кнопкой мыши в пользовательском элементе управления:

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

Я хотел бы поместить значок слева от «тестовой» строки во всплывающем меню, чтобы пользователю было легче ее распознать.Есть ли способ сделать это, кроме как установив для свойства OwnerDraw значение true (таким образом, я должен полностью нарисовать элемент меню самостоятельно, как это делается в этом примере: http://www.codeproject.com/KB/menus/cs_menus.aspx)?

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

Ответы [ 4 ]

18 голосов
/ 08 июля 2011

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

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

9 голосов
/ 08 июля 2011

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

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

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

1 голос
/ 08 июля 2011

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

...