WPF RichTextBox将FlowDocument节点元素移动到可视范围
默认情况下,当更新WPF RichTextBox时,系统不会自动将更新的内容展示到可视范围中,所以需要通过RichTextBox的一个方法ScrollToVerticalOffset来设置当前显示的位置
但是ScrollToVerticalOffset方法的传入参数是以像素为单位的,看过许多文档说通过读取当前行的高度和行数以及显示屏的分辨率来获取行高,把我弄得头大
不过最终还是找到了完美的解决方法,在此记录一下
给富文本插入纵向的滚动条
ScrollViewer.VerticalScrollBarVisibility="Auto"
然后向RichTextBox添加内容,并将标题从当前位置动态移动到可视范围的四分之一处
public void appendTitle(string content)
{
Paragraph paragraph = new Paragraph();
paragraph.FontFamily = new System.Windows.Media.FontFamily("微软雅黑");
paragraph.FontSize = 16;
paragraph.FontWeight = FontWeights.Bold;
paragraph.LineHeight = 1;
paragraph.Background = Brushes.DarkCyan;
paragraph.Foreground = Brushes.LightCyan;
paragraph.Margin = new System.Windows.Thickness(0, 2, 0, 2);
paragraph.Padding = new Thickness(5, 5, 2, 5);
paragraph.IsEnabled = false;
//paragraph
paragraph.Inlines.Add(new Run(content));
this.richTextBox1.Document.Blocks.Add(paragraph);
//将标题动态移动到可视范围
Paragraph selected = paragraph;
Rect rctStart = selected.ContentStart.GetCharacterRect(System.Windows.Documents.LogicalDirection.Forward);
Rect rctEnd = selected.ContentEnd.GetCharacterRect(System.Windows.Documents.LogicalDirection.Forward);
double orignLineHeight = richTextBox1.VerticalOffset;
double endLineHeight = (rctStart.Top + rctEnd.Bottom) / 2 + richTextBox1.VerticalOffset - richTextBox1.ViewportHeight / 4;
int index = 0,number=10;
DispatcherTimer _timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(0.01);
_timer.Tick += (st, et) =>
{
richTextBox1.ScrollToVerticalOffset((endLineHeight - orignLineHeight) * (index / (double)number) + orignLineHeight);//
if (index++ > number)
{
_timer.Stop();
}
};
_timer.Start();
}
看下效果