在Windows窗体中切换开关控件

时间:2016-07-18 08:13:54

标签: c# .net winforms checkbox toggleswitch

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

enter image description here

这是我的代码:

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

1 个答案:

答案 0 :(得分:6)

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

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

enter image description here

示例

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

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