【问题标题】:How can I draw arrows on my left-docked MenuStrip?如何在左侧停靠的 MenuStrip 上绘制箭头?
【发布时间】:2008-10-07 15:07:54
【问题描述】:
我有一个 C# 表单,我在其中放置了一个左侧停靠的 MenuStrip。这个MenuStrip 包含一些包含子菜单的菜单项,以及一些实际上是按钮的菜单项(单击它们会导致发生操作;注意,我意识到这不是一个好的设计)。
我想让具有关联菜单的菜单项在菜单项上绘制向右箭头,就像上下文菜单一样。我已经对ToolStripProfessionalRenderer 进行了子类化,并且可以在适当的时间调用OnRenderArrow()(例如,在OnRenderItemText() 或类似的范围内),但我似乎没有办法确定箭头的正确位置。
所以,这里有两个相互关联的问题:
- 有没有办法强制在顶级菜单项上绘制箭头?
- 如果没有,有没有办法确定菜单项上箭头的正确位置,以便可以手动调用
OnRenderArrow()?
谢谢!
【问题讨论】:
标签:
c#
.net
winforms
menustrip
【解决方案1】:
您为什么不考虑使用 System.Windows.Forms.ToolStrip 而不是 MenuStrip。这将允许您内置箭头功能,甚至可以解决您遇到的不良设计问题。
如果您愿意,您可以指定工具条项目不显示图像而只显示文本。通过这种方式,您几乎可以完全模仿菜单条的功能,但可以免费使用“下拉箭头”。
【解决方案2】:
我能够将它作为一个解决方案一起破解,但我仍然想要一些不那么迟钝的东西:
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
base.OnRenderItemText(e);
if (e.Item.GetType() == typeof(ToolStripMenuItem))
{
ToolStripMenuItem tsmi = (ToolStripMenuItem)e.Item;
if (tsmi.HasDropDownItems && tsmi.OwnerItem == null)
{
Rectangle bounds = tsmi.Bounds;
bounds.X = bounds.Right - 25;
bounds.Width = 25;
bounds.Y = 0;
ToolStripArrowRenderEventArgs tsarea = new ToolStripArrowRenderEventArgs(
e.Graphics,
e.Item,
bounds,
e.TextColor,
ArrowDirection.Right);
OnRenderArrow(tsarea);
}
}
}