我的WPF应用程序中有一个RichTextBox,里面有一个常规Text.There部分文本我想改变它的颜色。 例如:
该文件如下:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
我想改变它的颜色:<heading>Reminder</heading>
有没有办法让这种情况发生?
窗口的XAML:
<Window x:Class="WpfConfigHelper.Framework.AdditionalWinows.XmlAfterUpdateComparator"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XmlAfterUpdateComparator" Height="602" Width="1033">
<Grid>
<RichTextBox Height="426" HorizontalAlignment="Left" Margin="9,42,0,0" Name="BeforeXmlUpdated_TextBox" VerticalAlignment="Top" Width="495" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
<RichTextBox Height="426" HorizontalAlignment="Left" Margin="510,42,0,0" Name="AfterXmlUpdated_TextBox" VerticalAlignment="Top" Width="490" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/>
<Label Content="Before Update:" Height="29" HorizontalAlignment="Left" Margin="205,12,0,0" Name="BeforeXmlUpdated_Label" VerticalAlignment="Top" Width="115" />
<Label Content="After Update:" Height="31" HorizontalAlignment="Left" Margin="697,12,0,0" Name="AfterXmlUpdated_Label" VerticalAlignment="Top" Width="87" />
<Label Content="Do you agree to perform the changes from the right text box?" Height="33" HorizontalAlignment="Left" Margin="338,485,0,0" Name="DoYouAgreeWithChanges_Label" VerticalAlignment="Top" Width="497" />
<Button Content="Yes" Height="27" HorizontalAlignment="Left" Margin="308,524,0,0" Name="AgreedWithChanges_Button" VerticalAlignment="Top" Width="196" Click="AgreedWithChanges_Button_Click" />
<Button Content="No" Height="29" HorizontalAlignment="Left" Margin="516,524,0,0" Name="DisagreedWithChanges_Button" VerticalAlignment="Top" Width="221" Click="DisagreedWithChanges_Button_Click" />
<Label Content="Text removed" Height="39" HorizontalAlignment="Left" Margin="12,474,0,0" Name="label1" VerticalAlignment="Top" Width="177" Foreground="Red" FontSize="13"/>
<Label Content="Text inserted" Height="41" HorizontalAlignment="Left" Margin="906,477,0,0" Name="label2" VerticalAlignment="Top" Width="93" Foreground="Green" FontSize="13"/>
</Grid>
不久前,我看到一个使用正则表达式的代码,用于映射整个短语并在文本中更改其颜色,但我看不到它发生在这里。文本是静态的,没有格式化。
你认为我能以某种方式改变它,所以我可以格式化它,然后在用colord,字体等格式化的RichTextBox中显示它。?
答案 0 :(得分:0)
您是否看到此链接在此处回答检查:
答案 1 :(得分:0)
在RichTextBox中,您可以使用TextRange修改特定文本区域的字体。 TextRang需要开始和结束指针。如果已经为某些文本区域应用了格式,则无法通过使用索引在现有RichTextBox内容中获取这些指针,因为RichTextBox将文本内容视为符号而非字符。所以,我建议你为你的问题创建一个自定义的RichTextBox。在这里,我创建了从RichTextBox派生的CustomRichTextBox。方法ApplyPropertyValue用于格式化指定的文本区域。
public class CustomRichTextBox : RichTextBox
{
private readonly List<FormattingTag> formattingTags = new List<FormattingTag>();
public IEnumerable<FormattingTag> FormattingTags
{
get { return this.formattingTags; }
}
public void ApplyPropertyValue(int startIndex, int length, DependencyProperty formattingProperty, object value)
{
TextRange documentRange = new TextRange(this.Document.ContentStart, this.Document.ContentEnd);
documentRange.ClearAllProperties();
string documentText = documentRange.Text;
if (startIndex < 0 || (startIndex + length) > documentText.Length)
{
return;
}
this.CaretPosition = this.Document.ContentStart;
this.formattingTags.Add(FormattingTag.GetTag(this.Document.ContentStart, startIndex, length, formattingProperty, value));
foreach (var formattingTag in formattingTags)
{
formattingTag.ApplyFormatting();
}
}
}
在自定义控件中,您必须维护所有应用的格式。为此,我创建了下面的类,其中包含格式信息。
public class FormattingTag
{
private int start;
private int length;
private FormattingTag(int start, int length)
{
this.start = start;
this.length = length;
}
public int Start
{
get{ return this.start; }
}
public int Length
{
get { return this.length; }
}
public TextPointer StartPosition { get; private set; }
public TextPointer EndPosition { get; private set; }
public DependencyProperty FormattingProperty { get; private set; }
public object Value { get; private set; }
public static FormattingTag GetTag(TextPointer start, int startIndex, int length, DependencyProperty formattingProperty, object value)
{
while (start.GetPointerContext(LogicalDirection.Forward) != TextPointerContext.Text)
{
start = start.GetNextContextPosition(LogicalDirection.Forward);
}
TextPointer contentStart = start.GetPositionAtOffset(startIndex);
TextPointer contentEnd = contentStart.GetPositionAtOffset(length);
FormattingTag tag = new FormattingTag(startIndex, length);
tag.StartPosition = contentStart;
tag.EndPosition = contentEnd;
tag.FormattingProperty = formattingProperty;
tag.Value = value;
return tag;
}
public void ApplyFormatting()
{
TextRange range = new TextRange(this.StartPosition, this.EndPosition);
range.ApplyPropertyValue(this.FormattingProperty, this.Value);
}
}
您可以为文字应用格式,如下所示。
this.richTextBox.ApplyPropertyValue(2, 5, TextElement.ForegroundProperty, Brushes.Red);
this.richTextBox.ApplyPropertyValue(8, 11, TextElement.ForegroundProperty, Brushes.Blue);