ToolStripMenuItem 背景图像在鼠标悬停时消失 (.net winforms)

本文关键字:消失 net winforms 悬停 背景 图像 鼠标 ToolStripMenuItem | 更新日期: 2023-09-27 18:18:25

我已经在我的ToolStripMenuItem上设置了一个BackgroundImage,它是ContextMenuItem的一部分。

当我将鼠标悬停在它上面时,背景图像消失了。 蓝色的"突出显示"框出现在它上面(至少我认为这是正在发生的事情(。

当鼠标悬停在背景图像上时,如何显示背景图像?

我尝试在 MouseEnter 事件中设置图像,但没有运气。

ToolStripMenuItem 背景图像在鼠标悬停时消失 (.net winforms)

为此,您需要使用自定义渲染器。

在上下文菜单条上设置渲染器

contextMenuStrip1.Renderer = new BackgroundImageRenderer();

添加此"渲染器类">

根据需要自定义变量。

private class BackgroundImageRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
    {
        if (!e.Item.Selected)
        {
            base.OnRenderMenuItemBackground(e);
        }
        else
        {
            if (e.Item.Name == "theNameOfMyToolStripMenuItem")
            {
                Image backgroundImage = global::YourProject.Properties.Resources.ImageFileName;
                e.Graphics.DrawImage(backgroundImage, 0, 0, e.Item.Width, e.Item.Height);
            }
            else {
                base.OnRenderMenuItemBackground(e);
            }
        }
    }
}

创建一个从 ToolStripProfessionalRenderer 派生的类

public class customRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
        {
            // check if the object being rendered is actually a ToolStripButton
            if (e.Item is ToolStripButton)
            {
                ToolStripButton button = e.Item as ToolStripButton;
                // only render checked items differently
                if (button.Checked || button.Selected)
                {
                   //do work here
                }
                else
                    base.OnRenderButtonBackground(e);
            }
            // if this object is not a ToolStripButton, use the normal render event
            else
                base.OnRenderButtonBackground(e);
        }
        protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e)
        {
            //do checking here like above
            base.OnRenderItemBackground(e);
        }
    }

设置您在表单构造函数上的控件的呈现 - 适用于所有来自工具trip(工具trippbackground,toolstripbutton,contexmenustrip等(我刚刚覆盖了OnRenderButtonBackground,因为你提到了这个,你可以覆盖ToolStripProfessionalRenderer的其他方法

toolStrip1.Renderer = new customRenderer();//if you have this and want to override any behaviour
            menuStrip1.Renderer = new customRenderer();//if you have this and want to override any behaviour
            contextMenuStrip1.Renderer = new customRenderer();//if you have this and want to override any behaviour
public class customRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
    {
        // check if the object being rendered is actually a ToolStripButton
        if (e.Item is ToolStripButton)
        {
            ToolStripButton button = e.Item as ToolStripButton;
            // only render checked items differently
            if (button.Checked || button.Selected)
            {
               //do work here
            }
            else
                base.OnRenderButtonBackground(e);
        }
        // if this object is not a ToolStripButton, use the normal render event
        else
            base.OnRenderButtonBackground(e);
    }
    protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e)
    {
        //do checking here like above
        base.OnRenderItemBackground(e);
    }
}

这对我有用