【WP开发】如何处理溢出的文本
本文内容适用于Runtime App框架
在用户界面上显示文本,用得严重多的是TextBlock,凡是轻量级的东西都会很常用,TextBlock对于显示简单、少量的文本内容相当适合,不过,在我们考虑要在用户界面上显示格式较为复杂,并且内容相当长的文本时,就得使用RichTextBlock了。
多了一个Rich在前面就不得了,Rich原义为丰富的意思,所以该控件既能显示较长的文本,而且还能支持更多的文档格式。在RichTextBlock中,能过Blocks集合来设置内容,而Block类是抽象的,不能直接用,然它只有一个子类——Paragraph。
如其名,Paragraph表示一个段落。也就是说,在RichTextBlock控件中,文本内容可以由N个段落组成,关于什么叫段落,不要问我,如果你不知道段落是啥,请买上一壶好酒,一只肥鸭去回访你的小学语文老师。
好了,既然要显示大量文本,而我们手机的屏幕大小是有限的,如果屏幕空间不足够用来显示文本内容,该怎么办呢? 有朋友马上想到,啊,用ScrollViewr就可以滚动了。对,这也是一种方法,而且是一种相当简单的方法,把RichTextBlock直接用ScrollViewer包裹起来就可以了,不错的方案。
不过,有时候我们会想,滚动一般是保留垂直滚动,同时开启水平和垂直滚动不好,用户操作起来麻烦,又要左右滑,又要上下滑动,多么痛苦啊。而且,光是滚动好像还不够“新意”,现在的人很幽默,做什么事情都要“新”,好像不新就不行似的,都是被某些反面思想给害了。
好,P话不说,咱们说重点。RichTextBlock类有两个好玩的属性,大家要注意一下的。
HasOverflowContent:如果分配的空间不够用,文本内容显示不全,有溢出现象,该属性就会为true。
OverflowContentTarget:设置一个RichTextBlockOverflow对象,溢出来的文本会自动转到这个RichTextBlockOverflow对象上显示。为什么可以在界面上显示?因为RichTextBlockOverflow类继承了FrameworkElement,当然可以在界面上使用了。
别兴奋,还没完,你再看看RichTextBlockOverflow类,看清楚,是不是看到它也有HasOverflowContent和OverflowContentTarget属性? 看到了吗?
这就是说,如果这个RichTextBlockOverflow还不够用,文本太长,仍然溢出来了,这时候它的HasOverflowContent属性也为true,这时候,可以将RichTextBlockOverflow的OverflowContentTarget属性也赋值一个新的RichTextBlockOverflow对象。不断循环,直到文本不再溢出为止。
这好比一条锁链,每一节环环相扣。

现在,大家知道原理了,我们可以开工了,试试吧。
<FlipView x:Name="flpview">
<RichTextBlock x:Name="rtBlock" FontSize="20" TextIndent="38" Loaded="OnRichtextblockLoaded">
<Paragraph TextAlignment="Center" TextIndent="0" Margin="0,7,0,21">
<Bold FontSize="36" >关于二胡</Bold>
</Paragraph>
……
</RichTextBlock>
</FlipView>
假设这个RichTextBlock中有很多文本(这里我省略了,没必要贴出来)。
把RichTextBlock作为FlipView的项放进去,FlipView也是一个列表控件,但它每次只显示一个项,可以通过左右滑动来查看其他项,有点像翻页效果。假如RichTextBlock的文本很长,没法显示完全,接下来我们通过代码来动态添加N个RichTextBlockOverflow对象,直到文本被完全显示为止。
这些代码最好写在RichTextBlock控件的Loaded事件处理方法中,可确保文本已经被加载。
private void OnRichtextblockLoaded ( object sender, RoutedEventArgs e )
{
if (this.rtBlock.HasOverflowContent)
{
RichTextBlockOverflow flow = new RichTextBlockOverflow();
rtBlock.OverflowContentTarget = flow;
flpview.Items.Add(flow);
flow.UpdateLayout(); //刷新布局
bool hasFlow = flow.HasOverflowContent;
while (hasFlow)
{
RichTextBlockOverflow tmp = flow;
flow = new RichTextBlockOverflow();
tmp.OverflowContentTarget = flow;
this.flpview.Items.Add(flow);
flow.UpdateLayout();
hasFlow = flow.HasOverflowContent;
}
}
}
利用循环不断地向FlipView中添加RichTextBlockOverflow对象,不过一定得注意,每添加一个RichTextBlockOverflow对象都要调用它的UpdateLayout方法,目的是让它进行布局计算,并且放置好文本,最终才能决定内容是否溢出,HasOverflowContent属性的值才会准确。
运行应用程序后,可能有些朋友发现问题了,为什么后面的内容没了? 当滑到后面时,前面的内容又没了? 这是怎么回事? 老周在骗人吗?
是啊,我是在骗你呢,造成这个问题是因为FlipView也是ItemsControl,列表控件默认是使用虚拟化的,当某些项不在屏幕上呈现时,这些项会被XX,所以导致后面的内容空白,而前面的文本会丢失的原因,因为我们并不是通过数据绑定设置的项列表,故无法被正确还原。
解决这个问题也不难,只要为FlipView指定一个非虚拟化的面板就可,这里我选用StackPanel,也只有它最合理。把XAML代码改为:
<FlipView x:Name="flpview">
<FlipView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</FlipView.ItemsPanel>
……
这样一来,就不会出现文本丢失的问题了。
看看效果吧,还不错的。

示例源代码下载:http://files.cnblogs.com/tcjiaan/%E5%A4%84%E7%90%86%E6%BA%A2%E5%87%BA%E6%96%87%E6%9C%AC.zip
好了,吃饭去。
【WP开发】如何处理溢出的文本的更多相关文章
- asp.net简述WP开发模式
详情请参考菜鸟教程:http://www.runoob.com/aspnet/aspnet-tutorial.html 1.ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器 ...
- WP开发资源
wp开发:连续两次点击返回键退出程序的设计: http://hi.baidu.com/youngytj/item/6be317719cc371306cc37ce4 X http://www.cnblo ...
- WP开发笔记——WP7 SDK使用技巧
俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 W ...
- 在知乎回答的一个问题:C#初学者以后往WP开发走,还是往unity3d走?哪个更有前景呢
问题原文:我是一个C#初学者,想问个问题,我以后是该往WP开发方向走呢还是学习Unity3D往游戏开发,哪个更有前景呢,个人感觉未来几年iOS,WP,Java会三足鼎立,WP现在有潜力,但是U3D现在 ...
- Myeclipse开发内存溢出问题
MyEclipse开发内存溢出问题 window --> preferences --> MyEclipse --> servers --> Tomcat --> J ...
- 移动端Web开发如何处理横竖屏
<!Doctype html> <html> <head> <meta charset="utf-8"> <meta id=& ...
- WP开发使用BingMaps地图服务
原文:WP开发使用BingMaps地图服务 WP8使用BingMaps地图在 SOAP服务如何计算路径 首先需要用到3个服务 1.GeoCode服务-转换地址到地理的经纬度(WebServices地址 ...
- WP 开发中.xaml 与.xaml.cs
关于 WP 开发中.xaml 与.xaml.cs 的关系 今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...
- 系统不支持WP开发
好伤心,,,系统不支持WP开发... 买的ThinkPad S5 自带的win8,既不属于专业版,也不属于家庭版,,不属于各种版本. 其他条件都满足了.. 难道我要还系统吗??
随机推荐
- asp.net core 使用protobuf
在一些性能要求很高的应用中,使用protocol buffer序列化,优于Json.而且protocol buffer向后兼容的能力比较好. 由于Asp.net core 采用了全新的MiddleWa ...
- 2016-11-15mysql优化笔记
1.mysql连接数:MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放, ...
- Windows下mysql忘记root密码的解决方法
1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd窗口,切换到mysql的bin目录,运行命令: mysql ...
- MVC中使用Ueditor
配置.net mvc4项目使用ueditor编辑器. 1.首先下载Ueditor1.3.6开发版(http://ueditor.baidu.com/website/download.html) 2.将 ...
- ajax 跨域请求时url参数添加callback=?会实现跨域问题
例如: 1.在 jQuery 中,可以通过使用JSONP 形式的回调函数来加载其他网域的JSON数据,如 "myurl?callback=?".jQuery 将自动替换 ? 为正确 ...
- php CLI 模式下的传参方法
在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...
- Arc Engine下数据的加载处理
1.加载Shapefile数据 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeatureLa ...
- JS设计模式初探
目的:设计模式众多,尝试用博客记录下学到的不同设计模式的优劣,方便以后查阅. 前言:半年前看高程的时候看到设计模式这章,云里雾里,不是看不明白,而是不明白为啥要如此麻烦只为创建一个对象.直到最近完成了 ...
- poj1083
The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in ...
- linux系统用户以及用户组管理
本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...