Форматирование текста в ярлыке WinForm

Можно ли форматировать определенный текст в ярлыке WinForm вместо того, чтобы разбивать текст на несколько ярлыков? Пожалуйста, не обращайте внимания на tags HTML в тексте ярлыка; он используется только для того, чтобы понять мою точку зрения.

Например:

Dim myLabel As New Label myLabel.Text = "This is bold text. This is italicized text." 

Что бы создать текст в ярлыке как:

Это жирный текст. Это курсивный текст.

Это невозможно с ярлыком WinForms. На этикетке должен быть ровно один шрифт, с одним размером и одним лицом. У вас есть несколько вариантов:

  1. Использовать отдельные ярлыки
  2. Создайте новый производный от Control class, который делает собственный чертеж через GDI + и использует это вместо Label; это, вероятно, ваш лучший вариант, поскольку он дает вам полный контроль над тем, как инструктировать элемент управления для форматирования текста
  3. Используйте сторонний элемент управления ярлыками, который позволит вам вставлять fragmentы HTML (есть проверка кода CodeProject); это будет чужая реализация # 2.

Не совсем, но вы можете подделать его с RichTextBox только для чтения без границ. RichTextBox поддерживает Rich Text Format (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) Сначала добавьте свой собственный class 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(); } 

Образец

Работает как прелесть для меня! Решения, составленные из:

Как преобразовать строку в RTF в C #?

Форматировать текст в Rich Text Box

Как скрыть каретку в RichTextBox?

  1. Создайте текст как файл RTF в текстовой панели
  2. Создать Rich Text Control без границ и editable = false
  3. Добавить файл RTF в проект как ресурс
  4. В Form1_load do

    myRtfControl.Rtf = Resource1.MyRtfControlText

AutoRichLabel

AutoRichLabel с форматированным RTF-контентом

Я решал эту проблему, UserControl который содержит TransparentRichTextBox который является только для чтения. TransparentRichTextBox – это RichTextBox который позволяет быть прозрачным:

TransparentRichTextBox.cs:

 public class TransparentRichTextBox : RichTextBox { [DllImport("kernel32.dll", CharSet = CharSet.Auto)] static extern IntPtr LoadLibrary(string lpFileName); protected override CreateParams CreateParams { get { CreateParams prams = base.CreateParams; if (TransparentRichTextBox.LoadLibrary("msftedit.dll") != IntPtr.Zero) { prams.ExStyle |= 0x020; // transparent prams.ClassName = "RICHEDIT50W"; } return prams; } } } 

Конечный UserControl действует как shell TransparentRichTextBox . К сожалению, мне пришлось ограничивать его AutoSize по-своему, потому что AutoSize RichTextBox сломался.

AutoRichLabel.designer.cs:

 partial class AutoRichLabel { ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  private void InitializeComponent() { this.rtb = new TransparentRichTextBox(); this.SuspendLayout(); // // rtb // this.rtb.BorderStyle = System.Windows.Forms.BorderStyle.None; this.rtb.Dock = System.Windows.Forms.DockStyle.Fill; this.rtb.Location = new System.Drawing.Point(0, 0); this.rtb.Margin = new System.Windows.Forms.Padding(0); this.rtb.Name = "rtb"; this.rtb.ReadOnly = true; this.rtb.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; this.rtb.Size = new System.Drawing.Size(46, 30); this.rtb.TabIndex = 0; this.rtb.Text = ""; this.rtb.WordWrap = false; this.rtb.ContentsResized += new System.Windows.Forms.ContentsResizedEventHandler(this.rtb_ContentsResized); // // AutoRichLabel // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.BackColor = System.Drawing.Color.Transparent; this.Controls.Add(this.rtb); this.Name = "AutoRichLabel"; this.Size = new System.Drawing.Size(46, 30); this.ResumeLayout(false); } #endregion private TransparentRichTextBox rtb; } 

AutoRichLabel.cs:

 ///  /// An auto sized label with the ability to display text with formattings by using the Rich Text Format. ///  /// Short RTF syntax examples:  ///  /// Paragraph:  /// {\pard This is a paragraph!\par} ///  /// Bold / Italic / Underline:  /// \b bold text\b0 /// \i italic text\i0 /// \ul underline text\ul0 ///  /// Alternate color using color table:  /// {\colortbl ;\red0\green77\blue187;}{\pard The word \cf1 fish\cf0 is blue.\par ///  /// Additional information:  /// Always wrap every text in a paragraph.  /// Different tags can be stacked (ie \pard\b\i Bold and Italic\i0\b0\par) /// The space behind a tag is ignored. So if you need a space behind it, insert two spaces (ie \pard The word \bBOLD\0 is bold.\par) /// Full specification: http://www.biblioscape.com/rtf15_spec.htm  ///  public partial class AutoRichLabel : UserControl { ///  /// The rich text content. ///  /// Short RTF syntax examples:  ///  /// Paragraph:  /// {\pard This is a paragraph!\par} ///  /// Bold / Italic / Underline:  /// \b bold text\b0 /// \i italic text\i0 /// \ul underline text\ul0 ///  /// Alternate color using color table:  /// {\colortbl ;\red0\green77\blue187;}{\pard The word \cf1 fish\cf0 is blue.\par ///  /// Additional information:  /// Always wrap every text in a paragraph.  /// Different tags can be stacked (ie \pard\b\i Bold and Italic\i0\b0\par) /// The space behind a tag is ignored. So if you need a space behind it, insert two spaces (ie \pard The word \bBOLD\0 is bold.\par) /// Full specification: http://www.biblioscape.com/rtf15_spec.htm  ///  [Browsable(true)] public string RtfContent { get { return this.rtb.Rtf; } set { this.rtb.WordWrap = false; // to prevent any display bugs, word wrap must be off while changing the rich text content. this.rtb.Rtf = value.StartsWith(@"{\rtf1") ? value : @"{\rtf1" + value + "}"; // Setting the rich text content will trigger the ContentsResized event. this.Fit(); // Override width and height. this.rtb.WordWrap = this.WordWrap; // Set the word wrap back. } } ///  /// Dynamic width of the control. ///  [Browsable(false)] public new int Width { get { return base.Width; } } ///  /// Dynamic height of the control. ///  [Browsable(false)] public new int Height { get { return base.Height; } } ///  /// The measured width based on the content. ///  public int DesiredWidth { get; private set; } ///  /// The measured height based on the content. ///  public int DesiredHeight { get; private set; } ///  /// Determines the text will be word wrapped. This is true, when the maximum size has been set. ///  public bool WordWrap { get; private set; } ///  /// Constructor. ///  public AutoRichLabel() { InitializeComponent(); } ///  /// Overrides the width and height with the measured width and height ///  public void Fit() { base.Width = this.DesiredWidth; base.Height = this.DesiredHeight; } ///  /// Will be called when the rich text content of the control changes. ///  private void rtb_ContentsResized(object sender, ContentsResizedEventArgs e) { this.AutoSize = false; // Disable auto size, else it will break everything this.WordWrap = this.MaximumSize.Width > 0; // Enable word wrap when the maximum width has been set. this.DesiredWidth = this.rtb.WordWrap ? this.MaximumSize.Width : e.NewRectangle.Width; // Measure width. this.DesiredHeight = this.MaximumSize.Height > 0 && this.MaximumSize.Height < e.NewRectangle.Height ? this.MaximumSize.Height : e.NewRectangle.Height; // Measure height. this.Fit(); // Override width and height. } } 

Синтаксис форматированного текста довольно прост:

Параграф:

 {\pard This is a paragraph!\par} 

Полужирный / Курсив / Подчеркнутый текст:

 \b bold text\b0 \i italic text\i0 \ul underline text\ul0 

Альтернативный цвет с использованием таблицы цветов:

 {\colortbl ;\red0\green77\blue187;} {\pard The word \cf1 fish\cf0 is blue.\par 

Но обратите внимание: всегда заверните каждый текст в абзаце. Кроме того, различные tags могут быть сложены (например, \pard\b\i Bold and Italic\i0\b0\par ), а символ пробела за тегом игнорируется. Поэтому, если вам нужно место за ним, вставьте два пробела (т. \pard The word \bBOLD\0 is bold.\par ). Чтобы выйти \ или { или } , используйте ведущий \ . Для получения дополнительной информации есть полная спецификация формата форматированного текста в Интернете .

Используя этот довольно простой синтаксис, вы можете создать что-то похожее на первое изображение. Содержимое богатого текста, которое было прикреплено к свойству AutoRichLabel моего AutoRichLabel в первом изображении, было:

 {\colortbl ;\red0\green77\blue187;} {\pard\b BOLD\b0 \i ITALIC\i0 \ul UNDERLINE\ul0 \\\{\}\par} {\pard\cf1\b BOLD\b0 \i ITALIC\i0 \ul UNDERLINE\ul0\cf0 \\\{\}\par} 

AutoRichLabel с форматированным RTF-контентом

Если вы хотите включить перенос слов, установите максимальную ширину в желаемый размер. Тем не менее, это фиксирует ширину до максимальной ширины, даже если текст короче.

Повеселись!

В 2009 году есть отличная статья о Code Project под названием « Профессиональный HTML-рендеринг, который вы будете использовать », который реализует нечто похожее на то, что хочет исходный плакат.

Я успешно использую его в нескольких проектах.

Очень простое решение:

  1. Добавьте 2 ярлыка в форму, LabelA и LabelB
  2. Перейдите в свойства для LabelA и установите его влево.
  3. Перейдите в свойства LabelB и установите его налево.
  4. Установите шрифт в полужирный для LabelA.

Теперь LabelB будет сдвигаться в зависимости от длины текста LabelA.

Это все.

Я также хотел бы узнать, возможно ли это.

Когда мы не смогли найти решение, мы использовали элемент управления SuperLabel от Component Ones, который позволяет разметку HTML на ярлыке.

Понимая, что это старый вопрос, мой ответ больше для тех, как я, которые все еще могут искать такие решения и наткнуться на этот вопрос.

Помимо того, что уже упоминалось, LabelControl от DevExpress – это ярлык, который поддерживает это поведение – демонстрацию здесь . Увы, это часть платной библиотеки.

Если вы ищете бесплатные решения, я считаю, что HTML Renderer – это следующая лучшая вещь.

FlowLayoutPanel хорошо работает для вашей проблемы. Если вы добавите метки на панель streamа и отформатируете свойства шрифта и полей маркера, вы можете иметь разные стили шрифтов. Довольно быстрое и простое решение для работы.

Да. Вы можете реализовать, используя HTML Render. Видите ли, щелкните по ссылке: https://htmlrenderer.codeplex.com/ Надеюсь, это полезно.

Interesting Posts

Коробка для бродяг не может быть найдена или недоступна в удаленном каталоге – несовместимая версия завитка

Использование XSL-FO, CSS3 вместо CSS2 для создания разбитых на страницы документов, таких как PDF?

Сохранить модель ML для будущего использования

c #: разница между «System.Object» и «object»

Невозможно ввести unicode из-за сочетания клавиш

мобильное хромирование огней событие изменения в прокрутке

Можно ли полностью отказаться от бесплатного обновления Windows 10? Как это не кажется таким

Инструкция INC против ADD 1: Это имеет значение?

как преобразовать изображение в массив байтов в java?

Как фильтровать возвращаемые данные из jQuery.ajax ()?

ReDim Сохраняет multidimensional array в Visual Basic 6

не может загрузить такой файл – sqlite3 / sqlite3_native (LoadError) на rubyе на рельсах

Как установить Windows XP с USB-накопителя?

Размер плохих данных на HD-окнах7

Спиральное правило о объявлениях – когда оно ошибочно?

Давайте будем гением компьютера.