在Windows窗体中切换开关控件

我正在使用CheckBox设计一个Toggle Switch CheckBox ,但是目前我的控件只画了一个圆圈。 如何绘制如下图像的圆形图形以及如何根据控件的值更改圆的位置以表示已检查和未检查的状态,如下图所示:

在此处输入图像描述

这是我的代码:

 public class MyCheckBox:CheckBox { public MyCheckBox() { this.Appearance = System.Windows.Forms.Appearance.Button; this.BackColor = Color.Transparent; this.TextAlign = ContentAlignment.MiddleCenter; this.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.FlatAppearance.BorderColor = Color.RoyalBlue; this.FlatAppearance.BorderSize = 2; } protected override void OnPaint(PaintEventArgs e) { this.OnPaintBackground(e); using (var path = new GraphicsPath()) { var c = e.Graphics.ClipBounds; var r = this.ClientRectangle; r.Inflate(-FlatAppearance.BorderSize, -FlatAppearance.BorderSize); path.AddEllipse(r); e.Graphics.SetClip(path); base.OnPaint(e); e.Graphics.SetClip(c); e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; if (this.Checked) { using (var p = new Pen(FlatAppearance.BorderColor, FlatAppearance.BorderSize)) { e.Graphics.DrawEllipse(p, r); } } } } } 

我知道这是一个winforms问题。 但您可能需要查看Toggle Switches或阅读有关Universal Windows App Components的更多信息。 无论如何,这是Windows表单开发人员的答案。 它显示了我们如何自定义复选框的渲染以具有此类外观。

目前您只绘制一个椭圆,它是一个安静的切换按钮。 但是如果你想像下面的图像一样显示它,你应该首先绘制一个圆形的背景,然后根据Checked值绘制检查圆。 使用答案的示例部分中的代码,您可以使用具有此类UI的CheckBox

在此处输入图像描述

这个示例的重要之处在于它完全是CheckBox控件,支持使用鼠标和键盘进行检查,还支持数据绑定和CheckBox所有其他标准function。 代码并不完美,但是有一个是/否切换开关是一个很好的起点:

 using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; public class MyCheckBox : CheckBox { public MyCheckBox() { SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); Padding = new Padding(6); } protected override void OnPaint(PaintEventArgs e) { this.OnPaintBackground(e); e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; using (var path = new GraphicsPath()) { var d = Padding.All; var r = this.Height - 2 * d; path.AddArc(d, d, r, r, 90, 180); path.AddArc(this.Width - r - d, d, r, r, -90, 180); path.CloseFigure(); e.Graphics.FillPath(Checked ? Brushes.DarkGray : Brushes.LightGray, path); r = Height - 1; var rect = Checked ? new Rectangle(Width - r - 1, 0, r, r) : new Rectangle(0, 0, r, r); e.Graphics.FillEllipse(Checked ? Brushes.Green : Brushes.WhiteSmoke, rect); } } }