WPF实现搜索文本高亮
1、使用自定义的TextBlock
csharp
public class HighlightTextblock : TextBlock
{
public string DefaultText { get; set; }
public string HiText
{
get { return (string)GetValue(HiTextProperty); }
set { SetValue(HiTextProperty, value); }
}
// Using a DependencyProperty as the backing store for HiText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HiTextProperty =
DependencyProperty.Register("HiText", typeof(string), typeof(HighlightTextblock), new PropertyMetadata(string.Empty, OnHiTextChanged));
private static void OnHiTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
HighlightTextblock block = d as HighlightTextblock;
block.UpdateHighText(e.NewValue?.ToString());
}
private void UpdateHighText(string hiText)
{
if (string.IsNullOrEmpty(DefaultText) || DefaultText != Text)
{
DefaultText = Text;
}
if (!string.IsNullOrEmpty(hiText))
{
Text = string.Empty;
string[] spli = Regex.Split(DefaultText, hiText, RegexOptions.IgnoreCase);
for (int i = 0; i < spli.Length; i++)
{
Inlines.Add(new Run(spli[i]));
if (i < spli.Length - 1)
{
int searchstart = Text.Length;
var iCaseTextIndex = DefaultText.IndexOf(hiText, searchstart, StringComparison.OrdinalIgnoreCase);
if (iCaseTextIndex < 0)
{
continue;
}
string caseText = DefaultText.Substring(iCaseTextIndex, hiText.Length);
Inlines.Add(new Run(caseText) { Background = Brushes.Yellow });
}
}
}
else
{
Text = DefaultText;
}
}
}
2、界面中引用上述自定义控件
csharp
xmlns:local="clr-namespace:命名空间;assembly=包名"
3、使用高亮控件
csharp
<local:HighlightTextblock Text="{Binding 完整文本}" HiText="{Binding 要高亮的部分,例如搜索框的内容}"/>