c# - Windows 10 风格的 ContextMenuStrip

标签 c# winforms visual-studio contextmenu windows-10

有没有一种方法可以使用 Visual Studio 和具有 Windows 10 样式的窗体来创建 ContextMenuStrip。我知道,它的渲染器可以更改,以便看起来像 Windows Vista、7 和 8。这就是我所做的:

enter image description here

但我也想让它在 Windows 10 中看起来像这样:

enter image description here

有没有一种方法可以使用 Windows 窗体来完成,或者应该使用 Metro 类等以某种特殊方式来完成?

最佳答案

您可以实现您的自定义 Renderer并覆盖 OnRenderArrowOnRenderItemCheck 并传递您的自定义 ColorTable给它。然后将其设置为 ContextMenuRenderer

enter image description here

ColorTable 代码:

public class MyColorTable : ProfessionalColorTable
{
    public override Color MenuItemBorder
    {
        get { return Color.WhiteSmoke; }
    }
    public override Color MenuItemSelected
    {
        get { return Color.WhiteSmoke; }
    }
    public override Color ToolStripDropDownBackground
    {
        get { return Color.White; }
    }
    public override Color ImageMarginGradientBegin
    {
        get { return Color.White; }
    }
    public override Color ImageMarginGradientMiddle
    {
        get { return Color.White; }
    }
    public override Color ImageMarginGradientEnd
    {
        get { return Color.White; }
    }
}

渲染器代码:

public class MyRenderer : ToolStripProfessionalRenderer
{
    public MyRenderer()
        : base(new MyColorTable())
    {
    }
    protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
    {
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        var r = new Rectangle(e.ArrowRectangle.Location, e.ArrowRectangle.Size);
        r.Inflate(-2, -6);
        e.Graphics.DrawLines(Pens.Black, new Point[]{
        new Point(r.Left, r.Top),
        new Point(r.Right, r.Top + r.Height /2), 
        new Point(r.Left, r.Top+ r.Height)});
    }

    protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
    {
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        var r = new Rectangle(e.ImageRectangle.Location, e.ImageRectangle.Size);
        r.Inflate(-4, -6);
        e.Graphics.DrawLines(Pens.Black, new Point[]{
        new Point(r.Left, r.Bottom - r.Height /2),
        new Point(r.Left + r.Width /3,  r.Bottom), 
        new Point(r.Right, r.Top)});
    }
}

表单加载代码:

private void Form_Load(object sender, EventArgs e)
{
    this.contextMenuStrip1.Renderer = new MyRenderer();
}

关于c# - Windows 10 风格的 ContextMenuStrip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786250/

相关文章:

c# - 能够在 WCF 中将主体对象从客户端传送到服务端

c# - 我如何检查 listView 项目是否包含 FileInfo 变量?

c# - WinForm richtextbox深度行间距和字符间距

c# - 如何允许用户调整窗口大小?

visual-studio - tfs无法浏览项目

c# - Windows 应用商店应用程序中的页面全局键盘事件

C# Tip 计算器,方法未调用,无错误消息

c# - Docusign 指定的集成商 key 未找到或已禁用

visual-studio - 错误构建 : File 'COMPUTE_PATHS_ONLY.ts' not found in visual studio

c++ - Visual Studio MSVC 中 erf 的准确性是多少?