wpf 搜索过程中的文本着色

hgc7kmma  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(153)

我想根据用户搜索的文本更改文本的颜色,并忽略大小写字母
问题是,如果搜索文本在大小写字母方面不相同,则此代码将不起作用。
我希望得到关于如何以最佳方式改进代码的帮助,以便我知道如何为
忽略大写或小写字母的单词,并将单词原样放在TextBlock后面。
因为我可以忽略大写或小写字母,但返回的单词与搜索文本中的一样
而且不像TextBlock
如果这个代码可以改进,我也希望得到一些一般性的建议。
TextBox是我的搜索文本,TextBlock是我希望对其部分着色的文本
根据搜索结果

private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
{
    var searchText = (sender as TextBox)?.Text;
    if (!string.IsNullOrEmpty(searchText) && TextBlock.Text.Contains(searchText))
    {
        var splitText = Regex.Split(TextBlock.Text, searchText);
        TextBlock.Text = string.Empty;
        TextBlock.Inlines.Add(new Run { Text = splitText[0] });

        for (var i = 1; i < splitText.Length; i++)
        {
            TextBlock.Inlines.Add(new Run { Text = searchText, Foreground = Brushes.Yellow });
            TextBlock.Inlines.Add(new Run { Text = splitText[i] });
        }
    }
    else
    {
        string normalText = TextBlock.Inlines.Aggregate(string.Empty, (current, line) => current + (line as Run)?.Text);
        TextBlock.Inlines.Clear();
        TextBlock.Text = normalText;
    }
}
e4eetjau

e4eetjau1#

为了保持原文的大小写不变,这样如何

var input = "hElLo WoRlD";
var searchText = "llo";
var listSearchResults = new List<string>();

var currentPosition = 0;
while(true)
{
    var lastPosition = currentPosition;
    currentPosition = currentPosition >= input.Length ? -1 : input.IndexOf(searchText, currentPosition, StringComparison.CurrentCultureIgnoreCase);
    if (currentPosition == -1)
    {
        if (listSearchResults.Count > 0)
            listSearchResults.Add(input.Substring(lastPosition));
            
        break;
    }
    
    listSearchResults.Add(input.Substring(lastPosition, currentPosition - lastPosition));
    listSearchResults.Add(input.Substring(currentPosition, searchText.Length));
    currentPosition += searchText.Length;
}

if (listSearchResults.Count > 0)
{
    //found
    //build run based on listSearchResults
    
    foreach (var item in listSearchResults)
        Console.WriteLine(item);
}

https://dotnetfiddle.net/c3cOwR
我们的想法是使用IndexOf来移动原始字符串中的位置,并在原始字符串上使用Substring来获取其中的部分。
编辑:
要知道列表的哪一部分是searchText,只需执行以下操作

for (var i = 0; i < listSearchResults.Count; i++)
{
    var item = listSearchResults[i];
    Console.WriteLine($"{item} - {(i % 2 != 0)}");
}

mod操作(i % 2 != 0)上返回TRUE的项将是搜索文本的索引,因为列表中的每隔一个项就是搜索文本。
在这里看到它的使用:
https://dotnetfiddle.net/PqHzms

相关问题