Bry*_*oth 21 formatting text label winforms
是否可以格式化WinForm标签中的某些文本而不是将文本分成多个标签?请忽略标签文本中的HTML标签; 它只是用来表达我的观点.
例如:
Dim myLabel As New Label
myLabel.Text = "This is <b>bold</b> text. This is <i>italicized</i> text."
Run Code Online (Sandbox Code Playgroud)
哪个会在标签中生成以下内容:
这是粗体文字.这是 斜体文本.
The*_*urf 18
使用WinForms标签是不可能的.标签必须只有一种字体,只有一种尺寸和一种面.你有几个选择:
Geo*_*off 11
另一个解决办法,迟到了:如果你不想使用第三方控件,你只是希望呼吁关注一些在您的标签的文本,并且你确定有下划线,你可以使用一个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;
Run Code Online (Sandbox Code Playgroud)
结果:
Nig*_*ist 10
为我工作的解决方案 - 使用自定义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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
对我来说就像一个魅力!解决方案编译自:
在Form1_load中
myRtfControl.Rtf = Resource1.MyRtfControlText