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;
}
}
}
结果:
等...
我把排序算法变化的位置信息保存到一个数组中
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
,并根据项目索引 创建 每次发生交换操作时都应执行循环中断操作以正确可视化输出
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; } } }
TextRang
结果:
等...