Выделение нескольких символов в текстовой метке - PullRequest
0 голосов
/ 04 ноября 2010

Я ищу способ выделения нескольких символов в текстовой метке с помощью .NET Compact Framework. Например. в метке, которая содержит текст Hello World, я хочу выделить H и r, как в этом примере:

H ello Wo r ld

Моим первоначальным решением было неправильное использование & для подчеркивания целевых символов, но, к сожалению, оно будет подчеркивать только один символ. Мне все равно, будут ли символы другого цвета, жирным шрифтом или подчеркнуты, единственное, что важно, это то, что они выделяются.

1 Ответ

0 голосов
/ 05 ноября 2010

Предварительный просмотр:

Preview

Обновления:

Добавлена ​​поддержка выделения цвета.

Код:

Протестировано на .NET Compact Framework 3.5, Windows Mobile 6 SDK, вероятно, должно работать и на .NET Framework.

/// <summary>
/// A label which offers you the possibility to highlight characters 
/// at defined positions.
/// See <see cref="HighlightPositions"/>, <see cref="HighlightStyle"/> and
/// <see cref="HighlightColor"/>
/// The text in the Text property will be displayed.
/// </summary>
public partial class HighlightLabel : Control
{
    /// <summary>
    /// Initializes a new instance of the class.
    /// </summary>
    public HighlightLabel()
    {
        InitializeComponent();
    }
    /// <summary>
    /// An array of all positions in the text to be highlighted.
    /// </summary>
    public int[] HighlightPositions { get; set; }

    /// <summary>
    /// Gets or sets the highlight style.
    /// </summary>
    public FontStyle HighlightStyle { get; set; }

    /// <summary>
    /// Gets or sets the highlight color.
    /// </summary>
    public Color HighlightColor { get; set; }

    // Paints the string and applies the highlighting style.
    protected override void OnPaint(PaintEventArgs e)
    {
        if (HighlightPositions == null)
            HighlightPositions = new int[] { };

        var usedOffsets = new List<float>();

        for (var i = 0; i < Text.Length; i++)
        {
            var characterToPaint =
                Text[i].ToString(CultureInfo.CurrentCulture);

            var selectedFont = Font;
            var selectedColor = ForeColor;

            if (HighlightPositions.Contains(i))
            {
                selectedColor = HighlightColor;
                selectedFont = new Font(Font.Name, Font.Size, 
                    HighlightStyle);
            }

            var currentOffset = usedOffsets.Sum();

            e.Graphics.DrawString(characterToPaint, selectedFont,
                new SolidBrush(selectedColor),
                new RectangleF(e.ClipRectangle.X + currentOffset,
                    e.ClipRectangle.Y, e.ClipRectangle.Width,
                    e.ClipRectangle.Height));

            var offset = e.Graphics.MeasureString(characterToPaint,
                selectedFont).Width;

            usedOffsets.Add(offset);
        }
    }
}

Использование:

highlightLabel.HighlightPositions = new[] { 1, 8 };
highlightLabel.HighlightStyle = FontStyle.Bold;
highlightLabel.HighlightColor = Color.Red
...