窗10样式化的ContextMenuStrip [英] Windows 10 Styled ContextMenuStrip
问题描述
有没有一种方法使用Visual Studio和形式与Windows 10的风格打造的ContextMenuStrip。我知道,它的渲染器能够以有样子的Windows Vista,7和8来改变这就是我做了什么:
Is there a way to create ContextMenuStrip using Visual Studio and Forms with Windows 10 style. I know, that its Renderer can be changed in order to have look like Windows Vista, 7 and 8. And that is what I made:
不过,我也想使它看起来像这样在Windows 10:
But I also would like to make it look like this in Windows 10:
有没有办法使用Windows窗体做到这一点,还是应该以某种特殊的方式来完成,使用地铁班等?
Is there a way to do it using Windows Forms, or it should be done in some special way, using Metro classes etc?
推荐答案
您可以实现自定义的渲染
并重写 OnRenderArrow
和 OnRenderItemCheck
和您的自定义 ColorTable
传递给它。然后将其设置为渲染
你的文本菜单
。
You can implement your custom Renderer
and override OnRenderArrow
and OnRenderItemCheck
and pass your custom ColorTable
to it. Then set it as Renderer
of your ContextMenu
.
代码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)});
}
}
代码窗体的Load:
private void Form_Load(object sender, EventArgs e)
{
this.contextMenuStrip1.Renderer = new MyRenderer();
}
这篇关于窗10样式化的ContextMenuStrip的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!