Highlight 1 đoạn text trong control TextBlock

Highlight 1 đoạn text trong control TextBlock

Lập trình với Silverlight, dự là sẽ có lúc bạn phải highlight một hoặc một số đoạn text tron control TextBlock (như khi cài đặt tính năng search chẳng hạn).

Để làm điều này có thể có nhiều cách, ví dụ như nhét vào một StackPanel, trong các StackPanel đó thì lại add thêm nhiều TextBlock nhỏ, mỗi TextBlock chứa đoạn text với màu tương ứng. Cách này hoàn toàn khả dĩ, tuy nhiên nếu muốn highlight n đoạn text thì nhiều khả năng bạn sẽ phải tạo đến 2n+1 TextBlock :v siêu rườm rà.

Thật ra công việc của bạn có thể đơn giản hơn bằng việc sử dụng class {php}Run{/php} nằm trong namespace {php}System.Windows.Documents{/php}. Ví dụ mình dùng dưới đây là để highlight 1 đoạn text, muốn highlight nhiều đoạn thì cũng chỉ việc làm tương tự.

/// <summary>
/// Dùng để highlight 1 đoạn text
/// </summary>
/// <param name="textBlock">Control TextBlock có đoạn text cần highlight</param>
/// <param name="text">Đoạn text hiển thị trong TextBlock</param>
/// <param name="toSet">Đoạn text cần highlight</param>
private void SetTextBlock(TextBlock textBlock, string text, string toSet)
{
    //Trước tiên phải xóa nội dung của TextBlock
    textBlock.Inlines.Clear();

    int selectedIndex = text.IndexOf(toSet);

    //Tạo một con Run, con Run này sẽ là đoạn text nằm trước đoạn cần highlight
    Run before = new Run();
    before.Text = text.Substring(0, selectedIndex);

    //Tạo con Run thứ 2, con Run này chứa đoạn text cần highlight
    Run toSetRun = new Run();
    toSetRun.Text = toSet;
    //Trang trí cho con Run này theo ý muốn của bạn
    toSetRun.Foreground = new SolidColorBrush(Colors.Orange);
    toSetRun.FontWeight = FontWeights.ExtraBold;

    //Tạo con Run thứ 3, con Run này chứa đoạn text nằm phía sau đoạn cần highlight
    Run after = new Run();
    after.Text = text.Substring(selectedIndex + toSet.Length);

    //Cuối cùng là add hết mấy con Run vừa tạo vào TextBlock
    textBlock.Inlines.Add(before);
    textBlock.Inlines.Add(toSetRun);
    textBlock.Inlines.Add(after);
}

Thử áp dụng lên một ví dụ đơn giản, bạn sẽ có được kết quả đại loại như thế này:

Chỉ đơn giản vậy thôi, chúc các bạn vui vẻ! YOLO :3

Leave a Reply

Your email address will not be published. Required fields are marked *