我正在尝试使用WPF RichTextBox,并注意到我可以通过循环遍历RichTextBox.Document.Blocks来遍历构成其文档的块。
获取插入符号周围的块的最佳方法是什么?
我可以获得每个块的CaretPosition和ElementStart以及ElementEnd属性,但无法看到如何比较它们,因为实际的字符偏移不会暴露,除非我遗漏了一些明显的东西。
答案 0 :(得分:8)
var curCaret = richTextBox1.CaretPosition;
var curBlock = richTextBox1.Document.Blocks.Where(x => x.ContentStart.CompareTo(curCaret) == -1 && x.ContentEnd.CompareTo(curCaret) == 1).FirstOrDefault();
答案 1 :(得分:1)
上面的答案可能适用于WPF RTB但不适用于Silverlight 4.0。 SL很可能不允许访问RTB的Document protion。所以你必须通过反思来做到这一点....
这样的事情:
答案 2 :(得分:0)
在Silverlight5中获取用于更新工具栏的属性:
private void rtb_SelectionChanged(object sender, RoutedEventArgs e)
{
TextSelection ts = rtb.Selection;
object property;
property = ts.GetPropertyValue(Run.FontWeightProperty);
System.Windows.FontWeight fontWeight = property is System.Windows.FontWeight ? (FontWeight)property : FontWeights.Normal;
property = ts.GetPropertyValue(Run.FontStyleProperty);
System.Windows.FontStyle fontStyle = property is System.Windows.FontStyle ? (FontStyle)property : FontStyles.Normal;
TextDecorationCollection textDecorations = ts.GetPropertyValue(Run.TextDecorationsProperty) as TextDecorationCollection;
bool isUnderlined = textDecorations != null;
double? fontSize = ts.GetPropertyValue(Run.FontSizeProperty) as double?;
SolidColorBrush foreground = ts.GetPropertyValue(Run.ForegroundProperty) as SolidColorBrush;
Color foregroundColor = foreground != null ? foreground.Color : Colors.Black;
System.Diagnostics.Debug.WriteLine("fontweight:{0}, fontStyle:{1}, Underline:{2}, size:{3}, color:{4}",
fontWeight,
fontStyle,
isUnderlined,
fontSize,
foregroundColor);
if (fontSize.HasValue)
SetToolbarFontSize(fontSize.Value);
SetToolbarFontColor(foregroundColor);
}
答案 3 :(得分:0)
Paragraph currentParagraph = richTextBox1.CaretPosition.Paragraph;
此代码将返回一个Paragaph对象而不是Block对象,但是由于RichTextBox中的块通常是段落,因此不会造成任何问题。
Blocks属性是RichTextBox的content属性。它是段落元素的集合。