Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在vb.net或C中向菜单条分隔符添加信息性文本#_C#_Vb.net_Winforms - Fatal编程技术网

C# 如何在vb.net或C中向菜单条分隔符添加信息性文本#

C# 如何在vb.net或C中向菜单条分隔符添加信息性文本#,c#,vb.net,winforms,C#,Vb.net,Winforms,以窗口形式。我想在菜单分隔符中添加信息性文本。有人能建议怎么做吗? 例如,分隔符应该如下所示 Menu Item1 Menu Item2 ----- Separator title ----- Menu Item3 Menu Item4 经过多次尝试,我只能添加简单的分隔符。任何帮助都会很好所以你不需要分隔符,你需要一个禁用的菜单项 我认为这是不可能的。不管怎么说,内置的menustrip都不行。我不知道是否有第三部分的控制,你可以使用这个。 如果你一定需要它,只需按照你在问题中显示的

以窗口形式。我想在菜单分隔符中添加信息性文本。有人能建议怎么做吗? 例如,分隔符应该如下所示

Menu Item1 
Menu Item2 
----- Separator title ----- 
Menu Item3
Menu Item4 

经过多次尝试,我只能添加简单的分隔符。任何帮助都会很好

所以你不需要分隔符,你需要一个禁用的菜单项

我认为这是不可能的。不管怎么说,内置的menustrip都不行。我不知道是否有第三部分的控制,你可以使用这个。
如果你一定需要它,只需按照你在问题中显示的标题。不要为该菜单项的任何事件编写任何代码。

您可以创建自己的菜单分隔符

Public Class TextToolStripSeparator
    Inherits ToolStripMenuItem

    Public Overrides ReadOnly Property CanSelect() As Boolean
        Get
            Return DesignMode
        End Get
    End Property

    Public Overrides Property Text() As String
        Get
            Return MyBase.Text
        End Get
        Set
            value = value.Trim("-"C, " "C)
            MyBase.Text = "---- " & value & " -------"
        End Set
    End Property
End Class
如果它是在同一项目中定义的,它将自动出现在“插入”上下文菜单中


我还试图覆盖
OnPaint
方法。没有成功。有一些魔法正在发生,阻止所有者绘制的对象出现


编辑

最后,经过一些研究和反复尝试,我找到了一个更令人满意的解决方案。这就是结果的样子

首先,我们创建自己的工具条分隔符类

Public Class TextToolStripSeparator
    Inherits ToolStripMenuItem

    Public Overrides ReadOnly Property CanSelect() As Boolean
        Get
            Return DesignMode
        End Get
    End Property

    Public Overrides ReadOnly Property HasDropDownItems() As Boolean
        Get
            Return False
        End Get
    End Property
End Class
正如你所看到的,它非常简单。更复杂的部分在我们自己的
MenuStrip
类中。这里我们提供了一个定制的
ToolStripRenderer
,它最终完成了这项工作

Public Class MenuStripEx
    Inherits MenuStrip

    Public Sub New()
        Me.Renderer = New ToolStripRendererEx()
    End Sub

    Private Class ToolStripRendererEx
        Inherits ToolStripProfessionalRenderer

        Protected Overrides Sub OnRenderItemText(e As ToolStripItemTextRenderEventArgs)
            Const  flags As TextFormatFlags = TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter

            Dim item As ToolStripItem = e.Item
            If TypeOf item Is TextToolStripSeparator Then
                Dim textWidth As Integer = TextRenderer.MeasureText(item.Text, item.Font).Width
                Dim rect As Rectangle = e.TextRectangle
                rect.Width = e.ToolStrip.Width - rect.Left - 3
                TextRenderer.DrawText(e.Graphics, item.Text, item.Font, rect, Color.DimGray, flags)

                Dim y As Integer = rect.Y + rect.Height \ 2
                Dim margin As Integer = (rect.Width - textWidth) \ 2
                e.Graphics.DrawLine(Pens.DarkGray, rect.X, y, rect.X + margin, y)
                e.Graphics.DrawLine(Pens.DarkGray, rect.Right - margin, y, rect.Right, y)
            Else
                MyBase.OnRenderItemText(e)
            End If
        End Sub
    End Class
End Class
我需要为Olivier Jacot Descombes的解决方案创建一个C#实现,所以这里是为了防止其他人需要它。在我的例子中,我需要它作为
ContextMenuStrip
而不是
MenuStrip
,但它的工作原理是一样的,唯一的区别是我使用的名称

public class TextToolStripSeparator : ToolStripMenuItem
{
    public override bool CanSelect { get { return DesignMode; } }

    public override bool HasDropDownItems { get { return false; } }
}

public class ContextMenuStripEx : ContextMenuStrip
{
    public ContextMenuStripEx()
    {
        this.Renderer = new ToolStripRendererEx();
    }

    private class ToolStripRendererEx : ToolStripProfessionalRenderer
    {
        protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
        {
            const TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter;

            ToolStripItem item = e.Item;

            if (item is TextToolStripSeparator)
            {
                int textWidth = TextRenderer.MeasureText(item.Text, item.Font).Width;
                Rectangle rect = e.TextRectangle;
                rect.Width = e.ToolStrip.Width - rect.Left;
                TextRenderer.DrawText(e.Graphics, item.Text, item.Font, rect, Color.DimGray, flags);

                int y = rect.Y + rect.Height / 2;
                int margin = (rect.Width - textWidth) / 2;
                e.Graphics.DrawLine(Pens.DarkGray, rect.X, y, rect.X + margin, y);
                e.Graphics.DrawLine(Pens.DarkGray, rect.Right - margin, y, rect.Right, y);
            }
            else
            {
                base.OnRenderItemText(e);
            }
        }

    }
}

这样做可能会让你的客户感到惊讶,因为这不是一个普遍接受的做法。很抱歉先提供c#版本。我没有看到你的VB标签。谢谢你;我需要一个C#实现,所以我在下面添加了一个,以防其他人需要。这是否适用于dynamic contextMenuStrip?我已经试过了,但我不知道如何实现这一点。您能提供一些使用示例吗?