更改Winforms菜单下拉列表的边框颜色
Change the border color of Winforms menu dropdown list
是否可以更改工具条菜单下拉列表的边框颜色。
在我下面的示例中,我希望下拉菜单有 1 种颜色(蓝色),当前没有白色边框,但主菜单 ('My Menu') 项目保持白色。
有什么想法吗?
我现在无法制作演示应用程序,但是本文中的屏幕截图
http://www.vbforums.com/showthread.php?596563-100-Customizable-MenuStrip-ToolStrip-StatusStrip-including-common-presets 证明我们可以改变边框颜色。
那家伙开发了一些库,但它基于标准的 ToolStrip 实现。
希望这篇link对您有所帮助。
您可以为项目提供负边距以掩盖边框。
Is it possible to change the border color of a toolstrip menu dropdown list.
是的。继承自 ProfessionalColorTable
的 class 按预期工作:
class MenuColorTable : ProfessionalColorTable
{
public MenuColorTable()
{
// see notes
base.UseSystemColors = false;
}
public override System.Drawing.Color MenuBorder
{
get{return Color.Fuchsia;}
}
public override System.Drawing.Color MenuItemBorder
{
get{return Color.DarkViolet;}
}
public override Color MenuItemSelected
{
get { return Color.Cornsilk;}
}
public override Color MenuItemSelectedGradientBegin
{
get{return Color.LawnGreen;}
}
public override Color MenuItemSelectedGradientEnd
{
get { return Color.MediumSeaGreen; }
}
public override Color MenuStripGradientBegin
{
get { return Color.AliceBlue; }
}
public override Color MenuStripGradientEnd
{
get { return Color.DodgerBlue; }
}
}
表单加载中:
menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MenuColorTable());
如果视觉样式未打开,则不会使用所有颜色 table 项,而是使用一些 SystemColors
项。您在 Main()
:
中启用视觉样式
// must be done before any UI elements are used
Application.EnableVisualStyles();
您可能还想禁用系统颜色,如构造函数中所示。无论是否启用视觉样式,默认值都应该是 false,但也许其他东西改变了它?
base.UseSystemColors = false;
EnableVisualStyles()
和 UseSystemColors = false;
都必须到位才能实现 所有 颜色 table 中的渲染元素,否则只有一些被使用。 (尽管如此,MenuBorder
似乎无论如何都有效。)否则,结果如预期:
菜单渐变从AliceBlue到DodgerBlue; item 将鼠标悬停在其上使用从上到下的 LawnGreen 到 MediumSeaGreen 的渐变(鼠标未显示)。
打开时,菜单边框为紫红色(嗯,舒缓!)
将鼠标悬停在其中一项上(鼠标未显示),该项目使用 MenuItemSelected
颜色,即 Consilk。
如果您在使用覆盖时遇到问题,请检查您是否使用了正确的覆盖(或者它们的含义是否如名称所暗示的那样,有些一开始会产生误导)。
您还可以检查您是否使用 MenuStrip
作为菜单,Net 确实有另一个(较旧的)菜单 class,但您必须搜索才能找到它。您也可以更改或禁用任何主题,看看这是否会造成不利影响。
要更改边框颜色,遵循接受的答案中描述的 Plutonix 解决方案就足够了。
但是要删除项目和菜单边框之间的白色边框,您应该遵循以下解决方案之一:
解决方案 1
您可以通过实现继承 ProfessionalColorTable 的自定义颜色 table 并覆盖正确的属性来实现。为此,请按照下列步骤操作:
步骤
- 在您的窗体上放置一个 ToolStrip 并向其添加 DropDownButton 及其子项,并将子项的 ForeColor 设置为白色。
- 创建 CustomColorTable class 从 ProfessionalColorTable
继承
- 覆盖 ImageMarginGradientBegin、ImageMarginGradientMiddle、ImageMarginGradientEnd、ToolStripDropDownBackground 和 return 你想要的颜色(蓝色)。来自
- 在您的 Form Load 事件中,将 Renderer 属性 设置为 ToolStripManager 以使用使用您的 CustomColorTable 的 ToolStripProfessionalRenderer。
CustomColorTable 代码
public class CustomColorTable:ProfessionalColorTable
{
public override Color ImageMarginGradientBegin
{
get
{
return Color.MidnightBlue;
}
}
public override Color ImageMarginGradientMiddle
{
get
{
return Color.MidnightBlue;
}
}
public override Color ImageMarginGradientEnd
{
get
{
return Color.MidnightBlue;
}
}
public override Color ToolStripDropDownBackground
{
get
{
return Color.MidnightBlue;
}
}
}
表单加载代码
private void Form_Load(object sender, EventArgs e)
{
ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable());
}
截图
这是正常的截图
这里是放大 2 倍的屏幕截图:
解决方案 2
如果您不想在菜单项中使用图像,还有一个适用的替代解决方案。在这种情况下,找到您的下拉按钮的 DropDown 属性 并将其转换为 ToolStripDropDownMenu,然后将其 ShowImageMargin 属性 设置为 false 并将其 BackColor 设置为您想要的颜色(蓝色)。
private void Form_Load(object sender, EventArgs e)
{
//The item with text "My Menu" in your sample
var dropDownMenu = (ToolStripDropDownMenu)this.myMenuToolStripDropDownButton1.DropDown;
dropDownMenu.ShowImageMargin = false;
dropDownMenu.BackColor = Color.Navy;
}
是否可以更改工具条菜单下拉列表的边框颜色。
在我下面的示例中,我希望下拉菜单有 1 种颜色(蓝色),当前没有白色边框,但主菜单 ('My Menu') 项目保持白色。
有什么想法吗?
我现在无法制作演示应用程序,但是本文中的屏幕截图 http://www.vbforums.com/showthread.php?596563-100-Customizable-MenuStrip-ToolStrip-StatusStrip-including-common-presets 证明我们可以改变边框颜色。
那家伙开发了一些库,但它基于标准的 ToolStrip 实现。
希望这篇link对您有所帮助。
您可以为项目提供负边距以掩盖边框。
Is it possible to change the border color of a toolstrip menu dropdown list.
是的。继承自 ProfessionalColorTable
的 class 按预期工作:
class MenuColorTable : ProfessionalColorTable
{
public MenuColorTable()
{
// see notes
base.UseSystemColors = false;
}
public override System.Drawing.Color MenuBorder
{
get{return Color.Fuchsia;}
}
public override System.Drawing.Color MenuItemBorder
{
get{return Color.DarkViolet;}
}
public override Color MenuItemSelected
{
get { return Color.Cornsilk;}
}
public override Color MenuItemSelectedGradientBegin
{
get{return Color.LawnGreen;}
}
public override Color MenuItemSelectedGradientEnd
{
get { return Color.MediumSeaGreen; }
}
public override Color MenuStripGradientBegin
{
get { return Color.AliceBlue; }
}
public override Color MenuStripGradientEnd
{
get { return Color.DodgerBlue; }
}
}
表单加载中:
menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MenuColorTable());
如果视觉样式未打开,则不会使用所有颜色 table 项,而是使用一些 SystemColors
项。您在 Main()
:
// must be done before any UI elements are used
Application.EnableVisualStyles();
您可能还想禁用系统颜色,如构造函数中所示。无论是否启用视觉样式,默认值都应该是 false,但也许其他东西改变了它?
base.UseSystemColors = false;
EnableVisualStyles()
和 UseSystemColors = false;
都必须到位才能实现 所有 颜色 table 中的渲染元素,否则只有一些被使用。 (尽管如此,MenuBorder
似乎无论如何都有效。)否则,结果如预期:
菜单渐变从AliceBlue到DodgerBlue; item 将鼠标悬停在其上使用从上到下的 LawnGreen 到 MediumSeaGreen 的渐变(鼠标未显示)。
打开时,菜单边框为紫红色(嗯,舒缓!)
将鼠标悬停在其中一项上(鼠标未显示),该项目使用 MenuItemSelected
颜色,即 Consilk。
如果您在使用覆盖时遇到问题,请检查您是否使用了正确的覆盖(或者它们的含义是否如名称所暗示的那样,有些一开始会产生误导)。
您还可以检查您是否使用 MenuStrip
作为菜单,Net 确实有另一个(较旧的)菜单 class,但您必须搜索才能找到它。您也可以更改或禁用任何主题,看看这是否会造成不利影响。
要更改边框颜色,遵循接受的答案中描述的 Plutonix 解决方案就足够了。 但是要删除项目和菜单边框之间的白色边框,您应该遵循以下解决方案之一:
解决方案 1
您可以通过实现继承 ProfessionalColorTable 的自定义颜色 table 并覆盖正确的属性来实现。为此,请按照下列步骤操作:
步骤
- 在您的窗体上放置一个 ToolStrip 并向其添加 DropDownButton 及其子项,并将子项的 ForeColor 设置为白色。
- 创建 CustomColorTable class 从 ProfessionalColorTable 继承
- 覆盖 ImageMarginGradientBegin、ImageMarginGradientMiddle、ImageMarginGradientEnd、ToolStripDropDownBackground 和 return 你想要的颜色(蓝色)。来自
- 在您的 Form Load 事件中,将 Renderer 属性 设置为 ToolStripManager 以使用使用您的 CustomColorTable 的 ToolStripProfessionalRenderer。
CustomColorTable 代码
public class CustomColorTable:ProfessionalColorTable
{
public override Color ImageMarginGradientBegin
{
get
{
return Color.MidnightBlue;
}
}
public override Color ImageMarginGradientMiddle
{
get
{
return Color.MidnightBlue;
}
}
public override Color ImageMarginGradientEnd
{
get
{
return Color.MidnightBlue;
}
}
public override Color ToolStripDropDownBackground
{
get
{
return Color.MidnightBlue;
}
}
}
表单加载代码
private void Form_Load(object sender, EventArgs e)
{
ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable());
}
截图
这是正常的截图
这里是放大 2 倍的屏幕截图:
解决方案 2
如果您不想在菜单项中使用图像,还有一个适用的替代解决方案。在这种情况下,找到您的下拉按钮的 DropDown 属性 并将其转换为 ToolStripDropDownMenu,然后将其 ShowImageMargin 属性 设置为 false 并将其 BackColor 设置为您想要的颜色(蓝色)。
private void Form_Load(object sender, EventArgs e)
{
//The item with text "My Menu" in your sample
var dropDownMenu = (ToolStripDropDownMenu)this.myMenuToolStripDropDownButton1.DropDown;
dropDownMenu.ShowImageMargin = false;
dropDownMenu.BackColor = Color.Navy;
}