WPF RichTextBox文本的问题(好的绝对加分)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF RichTextBox文本的问题(好的绝对加分)相关的知识,希望对你有一定的参考价值。
参考技术A RichTextBox只是一个控件,它所承载的内容由其
Document
属性来呈现.
Document
是一个
FlowDocument
类型.
FlowDocument
是放置块内容的容器
(Blocks),
这里的块是指
非行内的元素(这个我也不知道怎么用中文解释,如果你知道
html
的话,它们就是类似于
DIV
标签,而不能是类似
SPAN
标签的元素).
可用的块级元素只有几个,自己查阅一下
msdn,
块级元素可以再包含块级元素或
行级---Inline
derived元素).
[这里的块
和
行,用中文真的不好解释:块
Block-derived
行
-
Inline
derived]
所以你可以像下面一样将你的
String
放到
Document
中:
myRTB.Document
=
new
FlowDocument(new
Paragraph(new
Run(myString)));
由于
FlowDocument
是基于块级元素的,
所以它的内容可以由它的
Blocks
属性设定,
上面一行的代码拆解就是:
FlowDocument
doc
=
new
FlowDocument();
Paragraph
p
=
new
Paragraph();
//
Paragraph
类似于
html
的
P
标签
Run
r
=
new
Run(myString);
//
Run
是一个
Inline
的标签
p.Inlines.Add(r);
doc.Blocks.Add(p);
myRTB.Document
=
doc;
重点:
初始
RichTextBox
的
Document,Document
的
Blocks
可以随意添加,修改,删除内容等。
块级元素(Block-derived
elements)
还有其它的,除了
Paragraph
外。
-----------
具体参考可以查阅
关于
WPF
中
Documents
部分的章节。
WPF RichTextBox滚动条自动滚动实例文本自动滚动实例
说明:
1.后台代码添加测试 数据
2.使用 richTextBox.ScrollToVerticalOffset()方法,滚动竖直方向滚动条位置
3.使用定时器DispatcherTimer,修改页面显示数据
4.自己计算处理,已经滚动的高度位置
Xaml代码:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="205*"/> <ColumnDefinition Width="87*"/> </Grid.ColumnDefinitions> <Button x:Name="button" Content="开始播放" HorizontalAlignment="Left" Margin="2,36,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Height="29" Click="button_Click"/> <RichTextBox x:Name="richTextBox" HorizontalAlignment="Left" Height="209" Margin="10,36,0,0" VerticalAlignment="Top" Width="170"> </RichTextBox> </Grid>
后台添加测试数据代码:
public text4() { InitializeComponent(); richTextBox.Document = doc; richTextBox.FontSize = 20; //添加内容 appendLine(null, "从你的全世界路过"); appendLine("one", "海上生明月"); appendLine(null, "从你的全世界路过"); appendLine(null, "天涯共此时"); appendLine("two", "张三丰"); appendLine(null, "从你的全世界路过"); appendLine(null, "鲁迅先生"); appendLine(null,null); } FlowDocument doc = new FlowDocument(); private void appendLine(string name, string line) { Paragraph p = new Paragraph(); if (string.IsNullOrEmpty(name) == false) doc.RegisterName(name, p); Run r = new Run(line); p.TextAlignment = TextAlignment.Center; p.Inlines.Add(r); doc.Blocks.Add(p); }
定时器显示控制代码:
int pIndex = 0; double curTop = 0; private void button_Click(object sender, RoutedEventArgs e) { //定时控制内容显示和滚动条位置 DispatcherTimer _timer = new DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += (st, et) => { //获取指定行的内容 BlockCollection col = richTextBox.Document.Blocks; int index = 0; TextElement prev = null; foreach (TextElement item in col) { //修改当前行的样式 if (index == pIndex) { AlterStyle(item, prev); } index++; prev = item; } pIndex++; }; _timer.Start(); } private void AlterStyle(TextElement item, TextElement prev) { //当前行 Paragraph cP = item as Paragraph; cP.Foreground = Brushes.Red; TextRange range = new TextRange(cP.ContentStart, cP.ContentEnd); //滚动位置控制 if (pIndex > 0 && range.Text.Length > 0) { //上一行,样式回调 if (prev != null) { prev.Foreground = Brushes.Black; } curTop += range.Text.Length > 7 ? 40 : 20; curTop += 20; richTextBox.ScrollToVerticalOffset(curTop); } }
运行结果:
以上是关于WPF RichTextBox文本的问题(好的绝对加分)的主要内容,如果未能解决你的问题,请参考以下文章
将 RTF 文本设置为 WPF RichTextBox 控件
如何从 WPF RichTextBox 中选择文本然后替换并着色
WPF RichTextBox滚动条自动滚动实例文本自动滚动实例
WPF自定义控件与样式-TextBox & RichTextBox & PasswordBox样式水印Label标签功能扩展