
在日常软件开发中,文本输入与显示是最基础的功能,也是最简单的内容,主要用于在表单中获取用户输入的内容,和向用户展示内容。如果只是简单的文本输入与显示,用Label和TextBox就可以实现,但是富文本对控件的要求就比较多了,比如加粗,斜体,下划线等样式设置,它在一些应用场景中比较常见,比如留言板,论坛,文章编辑器等,今天我们以一些简单的小例子,简述文本输入与显示的相关控件的使用,仅供学习分享使用,如有不足之处,还请指正。

概述
在WinForms窗体开发中,文本输入与显示是最基础的功能,也是最简单的内容,主要用于在表单中获取用户输入的内容,和向用户展示内容。常见的输入与显示控件有以下几种:
- TextBox 文本框,可以用于输入纯文本内容。
- Label,只能用于显示文本,不可编辑。
- RichTextBox,可以显示富文本,如加粗,斜体,以及图片等样式。
- LinkLabel,用于显示带链接的文本。
- MaskedTextBox,使用掩码区分正确和不正确的用户输入的文本框。
Label
Label 控件显示用户无法编辑的文本,主要用于标识窗体上的对象,并提供特定控件所代表或执行的作的说明。例如,可以使用标签向文本框、列表框、组合框等添加描述性标题,还可以编写代码来更改Label在运行时显示的文本。Label控件的关键属性如下所示:
- Text,用于在Lable控件上显示的内容。
- TextAlign,设置文本在Lable控件中的对齐方式。
- UseMnemonic ,由于Label控件无法接收焦点,因此可用于为其他相邻控件创建访问键,此属性用于标识是否将Text属性中文本的与号(&)设置为标签分配访问键。
- TabIndex 的Tab键的索引值,当被置为访问键时,它的TabIndex属性,需要比被相邻控件小1。
- AutoSize 自动设置Lable控件的大小,当此属性为true时,有助于调整控件的大小以适应较大或较小的标题,如果标题在运行时更改,则特别有用。如果此属性为false,则Text 属性中指定的单词将尽可能换行到下一行,但控件不会增长。
说明:使用一个符号 (&) 指示访问键,用两个符号 (&&) 显示符号,当设置访问键是,即可通过Alt+访问键进行快捷访问。
首先创建两个Label控件和TextBox控件,用于设置学生的年龄和姓名,在Form的Load事件中设置控件TabIndex和访问键属性,如下所示:
private void FrmText_Load(object sender, EventArgs e)
{
this.lblStudent.Text = "姓名(&N)";
this.lblStudent.TabIndex = 0;
this.lblStudent.UseMnemonic = true;
this.txtName.TabIndex = 1;
this.lblAge.Text = "年龄(&A)";
this.lblAge.TabIndex = 2;
this.lblAge.UseMnemonic = true;
this.txtAge.TabIndex = 3;
}
运行程序,在软件页面上通过Alt+访问键进行聚焦文本框,如下所示:

在上述示例中,不需要通过鼠标选择聚焦文本框,只需要通过Alt+访问键进行聚焦即可。需要注意的是首先Focus焦点应该在当前软件页面上,才可以通过快捷键进行访问。
LinkLabel
LinkLabel控件使你可以向 Windows 窗体应用程序添加 Web 样式链接,LinkLabel 控件具有Label控件的所有内容;还可以将文本的一部分设置为指向文件、文件夹或网页的链接。LinkLable控件的关键属性,如下所示:
- LinkArea 属性设置激活链接的文本区域。
- LinkColor VisitedLinkColor和ActiveLinkColor属性设置链接的颜色。
- LinkClicked 事件确定选择链接文本时会发生什么情况。
- Links 属性显示多个超链接。
- LinkData 可用于存储要显示的文件的位置或网站的地址。
首先拖动一个LinkLable控件到Form表单中,并设置Text和LinkArea属性,如下所示:

在LinkLabel控件的属性窗体的事件Tab页,通过双击设置LinkLabel的LinkClicked事件,如下所示:

在LinkClicked事件中,编写逻辑,打开网页,如下所示:
private void llblBaiDu_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(@"C:\Users\Alan.hsiang\AppData\Local\Google\Chrome\Application\chrome.exe","https://www.baidu.com");
}
运行程序,如下所示:

TextBox
TextBox控件用于从用户处获取输入或显示文本。此控件通常用于可编辑文本,但也可以将其设置为只读。 文本框可以显示多行,换行文本以适应控件大小并添加基本格式。 TextBox控件允许在控件中显示的或输入的文本使用单一格式。TextBox控件的关键属性:
- Text ,显示文本框中的文本。 默认情况下,文本框中最多输入 2048 个字符。 如果将 Multiline 属性设置为 true,则最多可以输入 32 KB 的文本。 Text 属性可以在设计时通过“属性”窗口设置,也可以在运行时通过代码或用户输入进行设置。通过读取 Text 属性,可以在运行时获取文本框中的当前输入内容。
- SelectionStart 属性设置当前选择内容的起始位置,如果设置为0,则将插入点立即置于第一个字符的左侧。
- SelectionLength 属性设置为要选择的文本长度。
- TabIndex,Tab键的索引,当TabIndex属性设置为0时,则默认将焦点设置为此控件,并显示插入点光标。
- PasswordChar,指定文本框中显示的字符,如将PasswordChar设置为星号,则无论用户在文本框中键入什么字符,都会显示星号。
- MaxLength,标识可以在文本框中键入多少个字符。 如果超出最大长度,系统将发出蜂鸣声,文本框不接受更多字符。
- ReadOnly,标识是否可以修改文本框中的文本内容,如果设置为true,文本框转换为只读控件。
- SelectedText 属性访问所选文本。
- Multiline 是否显示多行文本,如果设置为true,则显示为多行文本,如果要在多行 TextBox 中显示回车符,请使用 NewLine 属性。
- WordWrap属性,是否自动换行,如果设置为true,不会显示水平滚动条,如果设置为false,控件中的文本不会自动换行,因此将向右滚动,直到到达换行符。
- ScrollBars 属性是否显示滚动条,None:完全不显示,Horizontal:仅显示水平滚动条,Vertical:仅显示垂直滚动条,Both:同时显示水平和垂直滚动条。
首先拖动TextBox,Label控件到Form表单中,分别显示密文和明文,如下所示:

在属性窗体的事件Tab页,设置TextBox的TextChanged事件,如下所示:

在TextChanged事件中,同步将TextBox的内容显示在Label上,如下所示:
private void txtPassword_TextChanged(object sender, EventArgs e)
{
this.lblContent.Text = this.txtPassword.Text;
}
运行程序,效果如下所示:

通过上述示例可以看出:PasswordChar只是在显示上加密,但实际输入的文本不会以任何方式加密。
MaskedTextBox
MaskedTextBox是一个增强 TextBox 控件,支持用于接受或拒绝用户输入的声明性语法,通过此控件可以使用掩码区分正确和不正确的用户输入。MaskedTextBox控件的关键属性如下所示:
- Mask属性,可以设置控件的掩码。
-
MaskInputRejected当字符不符合掩码时,使用事件处理程序向用户发出警报
- TypeValidationCompleted事件处理程序在尝试提交的值对类型无效时向用户发出警报,即失去Focus焦点时触发类型验证事件。
首先拖动MaskedTextBox控件的Form窗体中,选择控件,点击控件右上角的“黑色右箭头”,在弹出的“MaskedTextBox任务”窗口中点击“设置掩码…”打开“输入掩码”对话框,如下所示:

在MaskedTextBox的属性窗口中,切换到事件Tab页,分别为控件设置TypeValidationCompleted事件和MaskInputRejected事件,如下所示:

在两个事件中,输入错误提示:
private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
lblError.Text = "输入错误";
}
private void maskedTextBox1_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
{
if (e.IsValidInput)
{
this.lblError.Text = "";
}
}
运行程序,示例效果如下:
说明:系统预先定义了一部分掩码,如果不合适还可以自定义新的掩码。
RichTextBox
Windows窗体中的RichTextBox控件用于显示,输入和操作格式化的文本,RichTextBox除了拥有TextBox控件的所有功能外,还可以显示字体,颜色,链接,从文件中读取和加载图像,以及查找指定的字符。RichTextBox控件通常用于提供类似字体处理程序(如Microsoft Word)的文本操作和显示功能。RichTextBox控件可以显示滚动条,且默认根据需要进行显示。RichTextBox的关键属性如下所示:
- SelectionFont 获取或设置当前选定文本或插入点的字体。
- FontStyle 指定应用到文本的字形信息。
- SelectionAlignment 获取或设置应用到当前选定内容或插入点的对齐方式。
- SelectionIndent 获取或设置所选内容开始行的缩进距离(以像素为单位)。
- SelectionCharOffset 获取或设置控件中的文本是显示在基线上、作为上标还是作为基线下方的下标。
- SelectionColor 获取或设置当前选定文本或插入点的文本颜色。
- SelectionBackColor 获取或设置在 System.Windows.Forms.RichTextBox 控件中选中文本时文本的颜色。
- SelectionBullet 获取或设置一个值,通过该值指示项目符号样式是否应用到当前选定内容或插入点。
- Clipboard Paste 粘贴指定剪贴板格式的剪贴板内容【插入图片时使用】。
- Find 在对搜索应用特定选项的情况下,在 System.Windows.Forms.RichTextBox 控件的文本中搜索位于控件内特定位置的字符串。
首先布局UI页面,主要包括RichTextBox,和一些功能按钮,如加粗,斜体,下划线等,如下所示:

定义RichTextBox的格式接口,和枚举类型:
namespace Okcoder.WinForm.Demo.Model
{
/// <summary>
/// 富文本框格式
/// </summary>
public interface IRichFormat
{
void SetFormat(RichTextBox rtbInfo);
}
}
namespace Okcoder.WinForm.Demo.Model
{
/// <summary>
/// 按钮类型
/// </summary>
public enum BTNType
{
Bold = 0,
Italic,
UnderLine,
Font,
BGColor,
ForeColor,
Left,
Center,
Right,
Indent,
OutIndent,
Ul,
StrikeLine,
SubScript,
SuperScript,
Pic,
Print,
Search,
Del,
FontSize
}
}
namespace Okcoder.WinForm.Demo.Model
{
public abstract class BaseRichFormat : IRichFormat
{
public abstract void SetFormat(RichTextBox rtbInfo);
}
}
实现具体的每一个按钮的功能:
namespace Okcoder.WinForm.Demo.Model
{
public class DefaultRickFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
}
}
/// <summary>
/// 加粗格式
/// </summary>
public class BoldRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Bold)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Bold);//支持位于运算
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Bold);
}
rtbInfo.SelectionFont = newFont;
}
}
/// <summary>
/// 斜体
/// </summary>
public class ItalicRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Italic)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Italic);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Italic);
}
rtbInfo.SelectionFont = newFont;
rtbInfo.Focus();
}
}
/// <summary>
/// 下划线
/// </summary>
public class UnderLineRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Underline)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Underline);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Underline);
}
rtbInfo.SelectionFont = newFont;
rtbInfo.Focus();
}
}
/// <summary>
/// 删除线
/// </summary>
public class StrikeLineRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
Font oldFont = rtbInfo.SelectionFont;
Font newFont;
if (oldFont.Underline)
{
newFont = new Font(oldFont, oldFont.Style & ~FontStyle.Strikeout);
}
else
{
newFont = new Font(oldFont, oldFont.Style | FontStyle.Strikeout);
}
rtbInfo.SelectionFont = newFont;
rtbInfo.Focus();
}
}
/// <summary>
/// 左对齐
/// </summary>
public class LeftRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
rtbInfo.Focus();
}
}
/// <summary>
/// 居中对齐
/// </summary>
public class CenterRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionAlignment == HorizontalAlignment.Center)
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
}
else
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Center;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 右对齐
/// </summary>
public class RightRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionAlignment == HorizontalAlignment.Right)
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Left;
}
else
{
rtbInfo.SelectionAlignment = HorizontalAlignment.Right;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 缩进对齐
/// </summary>
public class IndentRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
//每次以10个像素进行缩进
rtbInfo.SelectionIndent = rtbInfo.SelectionIndent + 10;
rtbInfo.Focus();
}
}
/// <summary>
/// 缩进对齐
/// </summary>
public class OutIndentRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
//每次以10个像素进行缩进
rtbInfo.SelectionIndent = rtbInfo.SelectionIndent - 10;
rtbInfo.Focus();
}
}
/// <summary>
/// 下标
/// </summary>
public class SubScriptRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionCharOffset < 0)
{
rtbInfo.SelectionCharOffset = 0;
}
else {
rtbInfo.SelectionCharOffset = -5;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 上标
/// </summary>
public class SuperScriptRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionCharOffset > 0)
{
rtbInfo.SelectionCharOffset = 0;
}
else {
rtbInfo.SelectionCharOffset = 5;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 字体
/// </summary>
public class FontRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
FontDialog f = new FontDialog();
if (f.ShowDialog() == DialogResult.OK)
{
FontFamily family = f.Font.FontFamily;
rtbInfo.SelectionFont = new Font(family, rtbInfo.SelectionFont.Size, rtbInfo.SelectionFont.Style);
}
rtbInfo.Focus();
}
}
/// <summary>
/// 文本颜色
/// </summary>
public class ForeColorRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
ColorDialog f = new ColorDialog();
if (f.ShowDialog() == DialogResult.OK)
{
rtbInfo.SelectionColor = f.Color;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 文本背景颜色
/// </summary>
public class BgColorRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
ColorDialog f = new ColorDialog();
if (f.ShowDialog() == DialogResult.OK)
{
rtbInfo.SelectionBackColor = f.Color;
}
rtbInfo.Focus();
}
}
/// <summary>
/// UL列表,项目符号样式
/// </summary>
public class UlRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
if (rtbInfo.SelectionBullet)
{
rtbInfo.SelectionBullet = false;
}
else {
rtbInfo.SelectionBullet = true;
rtbInfo.BulletIndent = 10;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 图片插入
/// </summary>
public class PicRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
OpenFileDialog o = new OpenFileDialog();
o.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
o.Title = "请选择图片";
o.Filter = "jpeg|*.jpeg|jpg|*.jpg|png|*.png|gif|*.gif";
if (o.ShowDialog() == DialogResult.OK) {
string fileName = o.FileName;
try
{
Image bmp = Image.FromFile(fileName);
Clipboard.SetDataObject(bmp);
DataFormats.Format dataFormat = DataFormats.GetFormat(DataFormats.Bitmap);
if (rtbInfo.CanPaste(dataFormat))
{
rtbInfo.Paste(dataFormat);
}
}
catch (Exception exc)
{
MessageBox.Show("图片插入失败。" + exc.Message, "提示",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
rtbInfo.Focus();
}
}
/// <summary>
/// 删除
/// </summary>
public class DelRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
rtbInfo.SelectedText = "";
rtbInfo.Focus();
}
}
/// <summary>
/// 查找
/// </summary>
public class SearchRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
string find = rtbInfo.Tag.ToString();
int index= rtbInfo.Find(find, 0,RichTextBoxFinds.None);
int startPos = index;
int nextIndex = 0;
while (nextIndex != startPos)//循环查找字符串,并用蓝色加粗12号Times New Roman标记之
{
rtbInfo.SelectionStart = index;
rtbInfo.SelectionLength = find.Length;
rtbInfo.SelectionColor = Color.Blue;
rtbInfo.SelectionFont = new Font("Times New Roman", (float)12, FontStyle.Bold);
rtbInfo.Focus();
nextIndex = rtbInfo.Find(find, index + find.Length, RichTextBoxFinds.None);
if (nextIndex == -1)//若查到文件末尾,则充值nextIndex为初始位置的值,使其达到初始位置,顺利结束循环,否则会有异常。
{
nextIndex = startPos;
}
index = nextIndex;
}
rtbInfo.Focus();
}
}
/// <summary>
/// 打印
/// </summary>
public class PrintRichFormat : BaseRichFormat
{
private RichTextBox richTextbox;
public override void SetFormat(RichTextBox rtbInfo)
{
this.richTextbox = rtbInfo;
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
// 打印文档
pd.Print();
}
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
//ev.Graphics.DrawString(richTextbox.Text);
//ev.HasMorePages = true;
}
}
/// <summary>
/// 字体大小
/// </summary>
public class FontSizeRichFormat : BaseRichFormat
{
public override void SetFormat(RichTextBox rtbInfo)
{
string fontSize = rtbInfo.Tag.ToString();
float fsize = 0.0f;
if (float.TryParse(fontSize, out fsize)) {
rtbInfo.SelectionFont = new Font(rtbInfo.Font.FontFamily, fsize, rtbInfo.SelectionFont.Style);
}
rtbInfo.Focus();
}
}
}
创建RichFormatFactory工厂,用于实现根据枚举类型,创建实例对象的方法:
namespace Okcoder.WinForm.Demo.Model
{
public class RichFormatFactory
{
public static IRichFormat CreateRichFormat(BTNType btnType)
{
IRichFormat richFormat;
switch (btnType)
{
case BTNType.Bold:
richFormat = new BoldRichFormat();
break;
case BTNType.BGColor:
richFormat = new BgColorRichFormat();
break;
case BTNType.Center:
richFormat = new CenterRichFormat();
break;
case BTNType.Del:
richFormat = new DelRichFormat();
break;
case BTNType.Font:
richFormat = new FontRichFormat();
break;
case BTNType.ForeColor:
richFormat = new ForeColorRichFormat();
break;
case BTNType.FontSize:
richFormat = new FontSizeRichFormat();
break;
case BTNType.Indent:
richFormat = new IndentRichFormat();
break;
case BTNType.Italic:
richFormat = new ItalicRichFormat();
break;
case BTNType.Left:
richFormat = new LeftRichFormat();
break;
case BTNType.OutIndent:
richFormat = new OutIndentRichFormat();
break;
case BTNType.Pic:
richFormat = new PicRichFormat();
break;
case BTNType.Print:
richFormat = new PrintRichFormat();
break;
case BTNType.Right:
richFormat = new RightRichFormat();
break;
case BTNType.Search:
richFormat = new SearchRichFormat();
break;
case BTNType.StrikeLine:
richFormat = new StrikeLineRichFormat();
break;
case BTNType.SubScript:
richFormat = new SubScriptRichFormat();
break;
case BTNType.SuperScript:
richFormat = new SuperScriptRichFormat();
break;
case BTNType.Ul:
richFormat = new UlRichFormat();
break;
case BTNType.UnderLine:
richFormat = new UnderLineRichFormat();
break;
default:
richFormat = new DefaultRickFormat();
break;
}
return richFormat;
}
}
}
在Form表单中,当点击按钮时,根据点击按钮的类型,创建不同的实例,来实现相应的功能:
namespace Okcoder.WinForm.Demo
{
public partial class FrmRichText : Form
{
public FrmRichText()
{
InitializeComponent();
}
public void btnButtonClick(object sender, EventArgs e) {
Button btn = (Button)sender;
BTNType btnType;
if (Enum.TryParse<BTNType>(btn.Tag.ToString(), out btnType)) {
if (btnType == BTNType.Search) {
if (!string.IsNullOrEmpty(this.txtSearch.Text.Trim()))
{
this.rtbInfo.Tag = this.txtSearch.Text.Trim();
}
else {
return;
}
}
IRichFormat richFomat = RichFormatFactory.CreateRichFormat(btnType);
richFomat.SetFormat(this.rtbInfo);
}
}
private void combFontSize_SelectedIndexChanged(object sender, EventArgs e)
{
float fsize = 12.0f;
if (combFontSize.SelectedIndex > -1) {
if (float.TryParse(combFontSize.SelectedItem.ToString(), out fsize)) {
rtbInfo.Tag = fsize.ToString();
IRichFormat richFomat = RichFormatFactory.CreateRichFormat(BTNType.FontSize);
richFomat.SetFormat(this.rtbInfo);
}
return;
}
}
}
}
运行代码,示例效果如下所示:

以上就是《基于.NET的Windows窗体编程之WinForms输入与显示》的全部内容,旨在抛砖引玉,一起学习,共同进步。
文章摘自:https://www.cnblogs.com/hsiang/p/20350936
