Windows 10 Styled ContextMenuStrip

时间:2015-09-25 16:01:46

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

有没有办法使用Visual Studio和Windows 10样式的Forms创建ContextMenuStrip。我知道,它的渲染器可以改变,看起来像Windows Vista,7和8.这就是我所做的:

enter image description here

但我也希望在Windows 10中看起来像这样:

enter image description here

有没有办法使用Windows Forms,或者应该以某种特殊的方式使用Metro类等?

1 个答案:

答案 0 :(得分:6)

您可以实施自定义Renderer并覆盖OnRenderArrowOnRenderItemCheck,并将自定义ColorTable传递给它。然后将其设置为Renderer的{​​{1}}。

enter image description here

ColorTable代码:

ContextMenu

渲染器代码:

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)});
    }
}