C#WPF RichText Box BackgroundProperty从文件读取时返回null

时间:2017-06-29 17:44:44

标签: c# wpf

我正在创建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”无法以任何形式访问,从调试器可见

我发现了其他两个类似的问题,但没有回答:

(C# WPF) How to change textrange background color?

https://webcache.googleusercontent.com/search?q=cache:iPuKFYskoNQJ:https://stackoverflow.com/questions/44595989/wpf-not-remembering-backgroundproperty-on-load-from-a-save+&cd=1&hl=es&ct=clnk&gl=co

1 个答案:

答案 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可以以某种方式进行优化,但这是有效的。