WPF RichTextBox将FlowDocument节点元素移动到可视范围

6 篇文章 0 订阅
3 篇文章 0 订阅

默认情况下,当更新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();
        }

看下效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值