首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止鼠标悬停显示禁用菜单项的边框

防止鼠标悬停显示禁用菜单项的边框
EN

Stack Overflow用户
提问于 2017-11-11 17:51:45
回答 2查看 570关注 0票数 1

当我悬停在一个ToolStripMenuItem上时,它会显示它周围的边框,即使它是禁用的。有什么财产可以移除吗?

我寻找过像HoverBorder这样的属性,但没有发现任何有用的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-11 18:30:59

默认情况下,ToolStripProfessionalRenderer使用MenuItemBorder属性ProfessionalColorTable绘制边框。

若要使已启用菜单项的边框可见,可以创建自定义ProfessionalColorTable和自定义ToolStripProfessionalRenderer,并添加返回默认边框颜色的新MenuItemEnabledBorder,还可以重写MenuItemBorder以返回Color.Transparent

然后,在您的自定义呈现程序中,当项目被高亮时,覆盖OnRenderMenuItemBackground并使用MenuItemEnabledBorder绘制边框就足够了。

代码语言:javascript
运行
复制
public class MyColorTable : ProfessionalColorTable
{
    public override Color MenuItemBorder { get { return Color.Transparent; } }
    public Color MenuItemEnabledBorder { get { return base.MenuItemBorder; } }
}

public class MyRenderer : ToolStripProfessionalRenderer
{
    public MyRenderer() : base(new MyColorTable()) { }
    protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
    {
        base.OnRenderMenuItemBackground(e);
        if (e.Item.Enabled && e.Item.Selected)
        {
            using (var pen = new Pen(((MyColorTable)ColorTable).MenuItemEnabledBorder))
            {
                var r = new Rectangle(2, 0, e.Item.Width - 4, e.Item.Height - 1);
                e.Graphics.DrawRectangle(pen, r);
            }
        }
    }
}

然后,要使用渲染器,只需将其设置为工具条的呈现器:

代码语言:javascript
运行
复制
this.toolStrip1.Renderer = new MyRenderer();

票数 1
EN

Stack Overflow用户

发布于 2017-11-11 18:32:02

您可以重写ToolStripProfessionalRenderer类并将颜色传递给它的基类构造函数(如果不希望边框传递原始BackColor):

代码语言:javascript
运行
复制
namespace WindowsFormsApplication11
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            menuStrip1.Renderer = new CustomColors();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }

    private class CustomColors : ToolStripProfessionalRenderer
    {
        public CustomColors() : base(new MyColors()) { }
    }

    private class MyColors : ProfessionalColorTable
    {
        public override Color MenuItemSelected
        {
            get { return Color.GreenYellow; }
        }
        public override Color MenuItemSelectedGradientBegin
        {
            get { return Color.DarkBlue; }
        }
        public override Color MenuItemSelectedGradientEnd
        {
            get { return Color.Yellow; }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47241021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档