WPF,richtextbox高亮文本

WPF,richtextbox highlight text

我把排序算法变化的位置信息保存到一个数组中

if (sorting[j] > sorting[j + 1])
{
      Swap(sorting, j, j + 1);

      SortingTraceInfo sortInfo = new SortingTraceInfo(); // struct Variable
      sortInfo.Position = j;  // change position save
      sortInfo.TargetPosition = j + 1;    // changed position save
      sortInfo.SortingNumbers = sorting.ToArray();    // 
      sortingInfos.Add(sortInfo);     
}

我知道变更仓位的索引。它输出的结果是richtextbox。

它应用了保存在结果(richtextbox)中的索引(sortInfo.position)。

生成富文本框。它应用于索引。 我想要的结果是

每点击一次按钮输出一行,颜色变化。

23 59 59 70 12 92 19 14 77 51 -> 70 < 红色,12 蓝色

索引(位置=3,目标位置=4),

23 59 59 12 70 92 19 14 77 51 -> 92 < 红色,19 蓝色

索引(位置=5,目标位置=6),

23 59 59 12 70 19 92 14 77 51 -> 92 < 红色,14 蓝色

索引(位置=6,目标位置=7),

然而,我失败了........

如果我没理解错的话,你的问题是如何用 RichTextBox 渲染不同颜色的文本! 为此,您可以为每个 Array 项目使用 TextRange 并根据项目情况应用画笔颜色(位置 -> 红色,目标位置 -> 蓝色,其他 -> 黑色),因此对于以下内容RichTextBox:

<StackPanel>
    <RichTextBox Name="Output">
    </RichTextBox>
    <Button Content="Next" Click="Next_OnClick"/>
</StackPanel>

您需要在每个“下一步”的按钮上单击:

  • 清除输出RichTetex
  • 遍历 Sorting Array,并根据项目索引
  • 创建 TextRang
  • 每次发生交换操作时都应执行循环中断操作以正确可视化输出

    public struct SortingTraceInfo
    {
      public int Position;
      public int TargetPosition;
      public int[] SortingNumbers;
    }
    
    public int[] Sorting = new[] { 23, 59, 59, 70, 12, 92, 19, 14, 77, 51 };        
    public List<SortingTraceInfo> SortingInfos=new List<SortingTraceInfo>();
    
    private void Next_OnClick(object sender, RoutedEventArgs e)
    {            
        Output.Document.Blocks.Clear();
        for (int j = 0; j < Sorting.Count()-1; j++)
        {
            if (Sorting[j] > Sorting[j + 1])
            {                   
                //render to RTB
                for (int i = 0; i < Sorting.Count(); i++)
                {
                    if (i==j)
                    {
                        //render the number red 
                        var textRange = new TextRange(Output.Document.ContentEnd, Output.Document.ContentEnd);
                        textRange.Text = Sorting[i] + " ";
                        textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Red);                            
                    }
                    else if(i==j+1)
                    {
                        //render the number blue 
                        var textRange = new TextRange(Output.Document.ContentEnd, Output.Document.ContentEnd);
                        textRange.Text = Sorting[i]+ " ";
                        textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue); 
    
                    }
                    else
                    {
                        //render the number black 
                        var textRange = new TextRange(Output.Document.ContentEnd, Output.Document.ContentEnd);
                        textRange.Text = Sorting[i] + " ";
                        textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Black);                             
                    }
                }
    
    
                //Swap(Sorting, j, j + 1);
                int tmp=Sorting[j];
                Sorting[j] = Sorting[j+1];
                Sorting[j + 1] = tmp;
    
                var sortInfo = new SortingTraceInfo(); // struct Variable
                sortInfo.Position = j; // change position save
                sortInfo.TargetPosition = j + 1; // changed position save
                sortInfo.SortingNumbers = Sorting.ToArray(); // 
                SortingInfos.Add(sortInfo);
    
                //handle one sorting operation one at a time 
                break;
            }               
        }           
    }
    

结果:

等...