我正在创建RichText编辑器,保存/加载文件等
我可以使用以下方法为文本(或背景颜色)指定高亮颜色:
TextRange selectionTextRange = new TextRange(rtb.Selection.Start, rtb.Selection.End);
selectionTextRange.ApplyPropertyValue(TextElement.BackgroundProperty, backgroundColor);
背景颜色是画笔
此部分有效,我可以使用以下方法将其保存到文件中:
filepath = savedialog.FileName;
TextRange t = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
FileStream file = new FileStream(filepath, FileMode.Create);
t.Save(file, System.Windows.DataFormats.Rtf);
这个文件可以在写字板上打开,一切正常
现在我可以使用以下命令将文件重新加载到我的程序中:
range = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
fStream = new FileStream(fileName, FileMode.OpenOrCreate);
if (fileName.Substring(fileName.Length - 3).ToLower().Equals("rtf"))
{
range.Load(fStream, DataFormats.Rtf);
}
else
{
range.Load(fStream, DataFormats.Text);
}
fStream.Close();
它正确显示文字高亮,字体,大小,一切正确,就像在写字板上一样
问题出现了:
但是当我跑步时
TextRange selectionTextRange = new TextRange(rtb.Selection.Start, rtb.Selection.End);
SolidColorBrush newBrush = (SolidColorBrush)selectionTextRange.GetPropertyValue(TextElement.BackgroundProperty);
即使突出显示正在工作(可见)
,它也会返回null奇怪的是,当我从应用程序中分配它然后请求它时,它确实返回正确的颜色,但是当加载文件时,如果TextRange没有BackgroundProperty但是其他每个属性都在那里,并且甚至更奇怪的是在调试器上我可以分析 selectionTextRange变量,它有一个带有正确背景的“XML”,只是这个“XML”无法以任何形式访问,从调试器可见
我发现了其他两个类似的问题,但没有回答:
答案 0 :(得分:1)
最终通过使用XAML代替RTF找到了问题,我可以轻松地#34;把它读作txt并理解发生了什么(继续使用RTF,只是用XAML我能理解发生了什么),代码:
TextRange selectionTextRange = new TextRange(rtb.Selection.Start, rtb.Selection.End);
SolidColorBrush newBrush = (SolidColorBrush)selectionTextRange.GetPropertyValue(TextElement.BackgroundProperty);
仅读取<Run>
中的<Run Background="#FF00FF">Some Text</Run>
属性,而不是<Span>
或<Paragraph>
属性,如下所示:
<Paragraph Background="#00FF00"><Span><Run>Some Text</Run></Span></Paragraph>
<Paragraph Background="#00FF00"><Run>Some Text</Run></Paragraph>
<Span Background="#00FF00"><Run>Some Text</Run></Span>
<Paragraph><Span Background="#00FF00"><Run>Some Text</Run></Span></Paragraph>
或任何其他类似的东西,所以试验一点我想出了它并且它正在工作:
TextRange selectionTextRange = new TextRange(rtb.Selection.Start, rtb.Selection.End);
SolidColorBrush newBrush = null;
newBrush = (SolidColorBrush)selectionTextRange.GetPropertyValue(TextElement.BackgroundProperty);
SolidColorBrush newBrush2 = null;
newBrush2 = (SolidColorBrush)rtb.Selection.Start.Paragraph.Background;
SolidColorBrush newBrush3 = null;
try {
newBrush3 = (SolidColorBrush)((Span)((Run)rtb.Selection.Start.Parent).Parent).Background;
}
catch (Exception ex) {
//Selection Parent is Run
//Run Parent can be Span, Paragraph, etc.
//Parent is not Span
}
if (newBrush == null) {
if (newBrush2 == null) {
if (newBrush3 == null) {
ClrPcker_Bg.SelectedColor = Colors.Transparent;
}
else {
ClrPcker_Bg.SelectedColor = newBrush3.Color;
}
}
else {
ClrPcker_Bg.SelectedColor = newBrush2.Color;
}
}
else {
ClrPcker_Bg.SelectedColor = newBrush.Color;
}
我觉得最后if
可以以某种方式进行优化,但这是有效的。