是否可以格式化WinForm标签中的某些文本而不是将文本分成多个标签?请忽略标签文本中的HTML标签; 它只是用来表达我的观点.
例如:
Dim myLabel As New Label myLabel.Text = "This is bold text. This is italicized text."
哪个会在标签中生成以下内容:
这是粗体文字.这是 斜体文本.
TheSmurf.. 18
使用WinForms标签是不可能的.标签必须只有一种字体,只有一种尺寸和一种面.你有几个选择:
使用单独的标签
创建一个新的Control派生类,通过GDI +创建自己的绘图,并使用它而不是Label; 这可能是您的最佳选择,因为它可以让您完全控制如何指示控件格式化其文本
使用第三方标签控件,可以让你插入HTML片段(有一堆 - 检查CodeProject); 这将是别人对#2的实现.
ageektrapped.. 15
不是真的,但你可以用没有边框的只读RichTextBox伪造它.RichTextBox支持RTF格式(rtf).
使用WinForms标签是不可能的.标签必须只有一种字体,只有一种尺寸和一种面.你有几个选择:
使用单独的标签
创建一个新的Control派生类,通过GDI +创建自己的绘图,并使用它而不是Label; 这可能是您的最佳选择,因为它可以让您完全控制如何指示控件格式化其文本
使用第三方标签控件,可以让你插入HTML片段(有一堆 - 检查CodeProject); 这将是别人对#2的实现.
不是真的,但你可以用没有边框的只读RichTextBox伪造它.RichTextBox支持RTF格式(rtf).
另一个解决办法,迟到了:如果你不想使用第三方控件,你只是希望呼吁关注一些在您的标签的文本,并且你确定有下划线,你可以使用一个LinkLabel.
请注意,许多人认为这是" 可用性犯罪 ",但如果你没有为最终用户消费而设计一些东西,那么你可能已经准备好了你的良心.
诀窍是向文本中要加下划线的部分添加禁用的链接,然后全局设置链接颜色以匹配标签的其余部分.你可以在设计时设置几乎所有必要的属性Links.Add()
,但是在这里它们是代码:
linkLabel1.Text = "You are accessing a government system, and all activity " + "will be logged. If you do not wish to continue, log out now."; linkLabel1.AutoSize = false; linkLabel1.Size = new Size(365, 50); linkLabel1.TextAlign = ContentAlignment.MiddleCenter; linkLabel1.Links.Clear(); linkLabel1.Links.Add(20, 17).Enabled = false; // "government system" linkLabel1.Links.Add(105, 11).Enabled = false; // "log out now" linkLabel1.LinkColor = linkLabel1.ForeColor; linkLabel1.DisabledLinkColor = linkLabel1.ForeColor;
结果:
为我工作的解决方案 - 使用自定义RichEditBox.使用正确的属性,它将被视为具有大胆支持的简单标签.
1)首先,添加具有禁用插入符号的自定义RichTextLabel类:
public class RichTextLabel : RichTextBox { public RichTextLabel() { base.ReadOnly = true; base.BorderStyle = BorderStyle.None; base.TabStop = false; base.SetStyle(ControlStyles.Selectable, false); base.SetStyle(ControlStyles.UserMouse, true); base.SetStyle(ControlStyles.SupportsTransparentBackColor, true); base.MouseEnter += delegate(object sender, EventArgs e) { this.Cursor = Cursors.Default; }; } protected override void WndProc(ref Message m) { if (m.Msg == 0x204) return; // WM_RBUTTONDOWN if (m.Msg == 0x205) return; // WM_RBUTTONUP base.WndProc(ref m); } }
2)将句子拆分为具有IsSelected标志的单词,以确定该单词是否应为粗体或否:
private void AutocompleteItemControl_Load(object sender, EventArgs e) { RichTextLabel rtl = new RichTextLabel(); rtl.Font = new Font("MS Reference Sans Serif", 15.57F); StringBuilder sb = new StringBuilder(); sb.Append(@"{\rtf1\ansi "); foreach (var wordPart in wordParts) { if (wordPart.IsSelected) { sb.Append(@"\b "); } sb.Append(ConvertString2RTF(wordPart.WordPart)); if (wordPart.IsSelected) { sb.Append(@"\b0 "); } } sb.Append(@"}"); rtl.Rtf = sb.ToString(); rtl.Width = this.Width; this.Controls.Add(rtl); }
3)添加函数将文本转换为有效的rtf(支持unicode!):
private string ConvertString2RTF(string input) { //first take care of special RTF chars StringBuilder backslashed = new StringBuilder(input); backslashed.Replace(@"\", @"\\"); backslashed.Replace(@"{", @"\{"); backslashed.Replace(@"}", @"\}"); //then convert the string char by char StringBuilder sb = new StringBuilder(); foreach (char character in backslashed.ToString()) { if (character <= 0x7f) sb.Append(character); else sb.Append("\\u" + Convert.ToUInt32(character) + "?"); } return sb.ToString(); }
对我来说就像一个魅力!解决方案编译自:
如何在C#中将字符串转换为RTF?
在富文本框中格式化文本
如何在RichTextBox中隐藏插入符号?
在wordpad中将文本创建为RTF文件
创建没有边框的富文本控件,editable = false
将RTF文件作为资源添加到项目中
在Form1_load中
myRtfControl.Rtf = Resource1.MyRtfControlText