C# 有没有办法隐藏ToolStripMenuItem上的箭头?

C# 有没有办法隐藏ToolStripMenuItem上的箭头?,c#,winforms,C#,Winforms,有没有办法隐藏ToolStripMenuItem上的箭头?箭头围在红方块内 我发现这非常有用,您可以创建自己的自定义ToolStripRenderer继承自ToolStripProfessionalRenderer,如下所示: public class CustomToolStripRenderer : ToolStripProfessionalRenderer { protected override void OnRenderArrow(ToolStripArrowRe

有没有办法隐藏
ToolStripMenuItem
上的箭头?箭头围在红方块内


我发现这非常有用,您可以创建自己的自定义ToolStripRenderer继承自
ToolStripProfessionalRenderer
,如下所示:

public class CustomToolStripRenderer : ToolStripProfessionalRenderer
{       
    protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
    {            
        e.ArrowRectangle = Rectangle.Empty;//Don't draw arrow
        base.OnRenderArrow(e);
    }
}
//and update the Renderer property of your MenuStrip
menuStrip1.Renderer = new CustomToolStripRenderer();
更新 对于您的要求,有一些方法可以做到,但我认为这是一个好方法:

public class CustomToolStripRenderer : ToolStripProfessionalRenderer
{       
    protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
    {                                    
        if (RenderArrow != null) RenderArrow(this, e);
        base.OnRenderArrow(e);            
    }
    public new event ToolStripArrowRenderEventHandler RenderArrow;//This will hide the default RenderArrow event which can't help you change the e argument because the default is fired after the Arrow is rendered.
}
//Now you have to create your own List<ToolStripItem> to contain all the items whose arrows should not be rendered
List<ToolStripItem> ItemsWithoutArrow = new List<ToolStripItem>();
//Add a method to add an item to that list
private void SuppressDrawArrow(ToolStripItem item)
{
   if (!ItemsWithoutArrow.Contains(item)) ItemsWithoutArrow.Add(item);
}
//Assign custom ToolStripRenderer for your MenuStrip
menuStrip1.Renderer = new CustomToolStripRenderer();
//Now add a RenderArrow event handler, this RenderArrow event is the new we created in the class CustomToolStripRenderer
((CustomToolStripRenderer)menuStrip1.Renderer).RenderArrow += (s, e) =>
 {                
    if(ItemsWithoutArrow.Contains(e.Item)) e.ArrowRectangle = Rectangle.Empty;
 };
//Add some item to the ItemsWithoutArrow to test
SuppressDrawArrow(item1ToolStripMenuItem);
公共类CustomToolStripRenderer:ToolStripProfessionalRenderer
{       
受保护的替代无效OnRenderRow(工具条箭头RenderReventArgs e)
{                                    
如果(renderRow!=null)renderRow(this,e);
基础。在渲染行(e);
}
public new event ToolStripArrowRenderEventHandler RenderRow;//这将隐藏默认的RenderRow事件,该事件无法帮助您更改e参数,因为默认事件是在呈现箭头后触发的。
}
//现在,您必须创建自己的列表,以包含不应呈现其箭头的所有项目
List ItemsWithoutArrow=新列表();
//添加一个方法以将项目添加到该列表中
专用空心SuppressDrawArrow(ToolStripItem项目)
{
如果(!ItemsWithoutArrow.Contains(item))ItemsWithoutArrow.Add(item);
}
//为菜单条指定自定义ToolStripRenderer
menuStrip1.Renderer=新的CustomToolStripRenderer();
//现在添加一个RenderRow事件处理程序,这个RenderRow事件是我们在CustomToolStripRenderer类中创建的新事件
((CustomToolStripRenderer)menuStrip1.Renderer)。renderRow+=(s,e)=>
{                
如果(ItemsWithoutArrow.Contains(e.Item))e.ArrowRectangle=Rectangle.Empty;
};
//将一些项目添加到要测试的项目箭头
SuppressDrawArrow(item1ToolStripMenuItem);
另一个解决方案(我喜欢一个问题的许多解决方案:)

公共类CustomToolStripRenderer:ToolStripProfessionalRenderer
{       
受保护的替代无效OnRenderRow(工具条箭头RenderReventArgs e)
{                                    
如果(!itemsWithoutArrow.Contains(e.Item))base.onrenderRow(e);
}
public void SuppressDrawArrow(ToolStripItem项目){
如果(!itemsWithoutArrow.Contains(item))itemsWithoutArrow.Add(item);
}
public void AllowDrawArrow(ToolStripItem项目){
项目如箭头所示。移除(项目);
}
私有列表项swithoutarrow=新列表();
}
//在代码中使用
CustomToolStripRenderer=新建CustomToolStripRenderer();
SuppressDrawArrow(item1ToolStripMenuItem);
menuStrip1.Renderer=渲染器;
//此解决方案符合您的要求(绘制或不绘制箭头),但如果您还希望更改箭头颜色,则以前的解决方案会更好。

我发现我们可以用很多选项自由渲染它。太好了:)

删除子菜单项?您可能需要覆盖
OnPaint
方法,并根据自己的喜好绘制它。@LarsTech看起来OP想要保留子菜单项,这有点奇怪,除非他想要另一种样式的箭头。@KingKing没错-我实际上嵌入了一个带有图片框的控件,以预览父项的外观。很抱歉,这张图片不清晰。@LarsTech+1:)我的第一个想法是非常酷的,它可以普遍使用。是否可以只对一个
ToolStripMenuItem
工作?因此,这将是菜单上的一个特定下拉列表。@IanO'Brien:在
onrenderRow
中,检查
e.Item
是否是您要查找的
ToolStripMenuItem
。感谢您对此进行扩展-我非常感谢。我希望这能帮助其他人,因为我找不到像这样的问题。
public class CustomToolStripRenderer : ToolStripProfessionalRenderer
{       
    protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
    {                                    
       if(!itemsWithoutArrow.Contains(e.Item)) base.OnRenderArrow(e);            
    }
    public void SuppressDrawArrow(ToolStripItem item){
       if (!itemsWithoutArrow.Contains(item)) itemsWithoutArrow.Add(item);
    }
    public void AllowDrawArrow(ToolStripItem item){
       itemsWithoutArrow.Remove(item);
    }
    private List<ToolStripItem> itemsWithoutArrow = new List<ToolStripItem>();
}
//Use in code
CustomToolStripRenderer renderer = new CustomToolStripRenderer();
renderer.SuppressDrawArrow(item1ToolStripMenuItem);
menuStrip1.Renderer = renderer;    
//This solution fits your requirement (draw or don't draw arrow) but if you also want to change such as ArrowColor, the previous solution would be better.