触摸屏的按钮开发起来非常方便,只要设置好样式和文本,以及绑定的变量,一个开关就做好了。
而用winform要实现同样的功能,要编写许多代码。
花木兰控件库的ToggleButton可以这样做切换,但是有几点不方便的地方。于是修改了以下几点:
- 文本修改成可以换行:
文本居中且可以自动换行,而且通过修改Padding可以设置每一行显示多少个字,比如我要改成每行最多三个字:
- 圆角修改成可以设置
- 点击时切换文本
最终效果就是点击切换状态、背景和文本。
查看按钮的状态。
private void toggleButton1_Click(object sender, EventArgs e)
{
HML.ToggleButton btn = (HML.ToggleButton)sender;
MessageBox.Show(btn.Checked.ToString());
}
控件库源码:添加链接描述
打开解决方案把 HML 项目里面的 ToggleButton 的代码替换成下面的代码,把HML项目重新生成,获得 HML.ComplexityPropertys.dll 和 HML.dll 文件,引入自己的项目即可。
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace HML
{
/// <summary>
/// 开关按钮控件
/// </summary>
[Description("开关按钮控件")]
[ToolboxItem(true)]
[DefaultProperty("Checked")]
[DefaultEvent("Click")]
[TypeConverter(typeof(PropertyOrderConverter))]
[ToolboxBitmap(typeof(ToggleButton), "Controls.ToggleButton.ToggleButton.bmp")]
public class ToggleButton : MainThreadAnimationControl
{
#region 新增事件
private static readonly object EventCheckedChanged = new object();
/// <summary>
/// 开关状态更改事件
/// </summary>
[Description("开关状态更改事件")]
public event EventHandler CheckedChanged
{
add {
Events.AddHandler(EventCheckedChanged, value); }
remove {
Events.RemoveHandler(EventCheckedChanged, value); }
}
#endregion
#region 停用事件
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler RightToLeftChanged
{
add {
base.RightToLeftChanged += value; }
remove {
base.RightToLeftChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler ImeModeChanged
{
add {
base.ImeModeChanged += value; }
remove {
base.ImeModeChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler BackColorChanged
{
add {
base.BackColorChanged += value; }
remove {
base.BackColorChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler ForeColorChanged
{
add {
base.ForeColorChanged += value; }
remove {
base.ForeColorChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler BackgroundImageChanged
{
add {
base.BackgroundImageChanged += value; }
remove {
base.BackgroundImageChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler BackgroundImageLayoutChanged
{
add {
base.BackgroundImageLayoutChanged += value; }
remove {
base.BackgroundImageLayoutChanged -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event EventHandler DoubleClick
{
add {
base.DoubleClick += value; }
remove {
base.DoubleClick -= value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new event MouseEventHandler MouseDoubleClick
{
add {
base.MouseDoubleClick += value; }
remove {
base.MouseDoubleClick -= value; }
}
#endregion
#region 新增属性
private string textChecked="中转爪已闭合";
/// <summary>
/// 图标Size
/// </summary>
[Description("按钮Checked文本")]
[Category("杂项")]
[DefaultValue(typeof(string), "中转爪已闭合")]
public string TextChecked
{
get {
return textChecked; }
set {
textChecked = value; Invalidate(); }
}
private string textUnChecked = "中转爪已打开";
/// <summary>
/// 图标Size
/// </summary>
[Description("按钮UnChecked文本")]
[Category("杂项")]
[DefaultValue(typeof(string), "中转爪已打开")]
public string TextUnChecked
{
get {
return textUnChecked; }
set {
textUnChecked = value; Invalidate(); }
}
private int cornerRadius = 10;
/// <summary>
/// 图标Size
/// </summary>
[Description("按钮圆角角度")]
[Category("杂项")]
[DefaultValue(typeof(int), "10")]
public int CornerRadius
{
get {
return cornerRadius; }
set {
cornerRadius = value; Invalidate(); }
}
private float paddingLR = 30;
/// <summary>
/// 图标Size
/// </summary>
[Description("按钮左右内边距")]
[