【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

好了,吃饭去。

时间: 2024-10-21 04:57:05

【WP开发】如何处理溢出的文本的相关文章

C#学习(九)之Windows Store App &amp; WP 开发小记(一)

由于课程已经讲述完毕,所以本次学习记录就讨论记录一下我在Windows Store App & WP开发中遇到的一些问题与收获. 一.数据库(Sqlite)的使用 虽然资料很难找,但sqlite在这两个平台的使用还是很简单的. 首先是环境配置阶段: 1.工具->拓展与更新->联机,然后在右上搜索sqlite,之后下载安装下图两个打勾的拓展包,注意要重启VS方才生效. 2.项目->管理NuGet程序包->联机,搜索sqlite,安装下图打勾内容,如果项目多出下图两个文件即安装

我的【学WP开发】应用开发历程

没有谁一开始就是开发大神,希望会从[学WP开发]应用摸索中成长,我会努力从新手小白蜕变成一名大神WP开发者,你,也可以! 先介绍一下我自己吧,我的微博昵称叫@ViiBoo-维柏,大家也可以叫我维柏,我是一名中专的学生,我对于WP开发者来说,也不过是一个小白而已,我学WP开发的时间很短,也就几个月的时间,甚至连C#的课程都没有学完,但我对于WP开发的热爱,导致于我的第一个应用[学WP开发]匆匆上线了. 刚开始的[学WP开发]的第一个版本说实话,真的很烂,虽然我只是一个开学C#的小白,但我第一次接触

wp开发之一,第二个异常

1.写了ToDoDataContext类,实现数据存储 在实例化类中,忘记检查 数据库 是否已存在,导致一直报错: "System.Data.SqlServerCe.SqlCeException"类型的未经处理的异常在 Microsoft.Phone.Interop.ni.dll 中发生 经过在ToDoDataContext 实现 CreateDatabase() 后数据保存可正常保存. 2.错误  无法将2类型"System.Data.Linq.Table<Table

Myeclipse开发内存溢出问题

MyEclipse开发内存溢出问题 window --> preferences --> MyEclipse --> servers --> Tomcat --> JDK 里面在Optional Java VM arguments: 下面加如下内容: -Xmx512m -Xms256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -------------------------------------------------------

WP开发笔记——WP7 SDK使用技巧

俗话说的好,工欲善其事,必先利其器. 入门WP开发之前,免不了要先接触开发环境和开发工具.使用WP7 SDK进行开发,我们需要掌握SDK的一些实用技巧,以便我们的开发. 一.开启/关闭电脑键盘输入 WP7模拟器默认状态只能通过模拟出来的QWERTY键盘输入,用鼠标一个一个点太慢了. 这里介绍下开启/关闭电脑键盘输入的方法,详细操作步骤如下: 首先打开模拟器,在需要输入文字的地方点击鼠标,这时按下电脑键盘的PageUp键即可开启键盘输入,同时虚拟键盘将会自动关闭.如果需要关闭电脑键盘输入开启虚拟键

【WP开发学习笔记】之pivot控件

博主wp开发小白,学习中...欢迎交流,微博@马and康 pivot控件中文也称为枢纽,是wp系统中最常用的控件之一,几乎所有个软件多多少少都会运用这个控件,比如设置.日历等等:该控件可以实现页面左右的快速切换,运行也十分流畅.如在设置中通过左右滑动可以切换为应用程序.系统,日历中通过左右滑动可以切换年.月.日: 首先可以通过项目模板直接建立一个pivot应用程序,或者通过拖动工具箱中的pivot控件,当然也可以直接通过xaml代码来直接写出来,这一点就不多说了: 我在用pivot控件时遇到的第

多行溢出 ,文本显示为省略号如何写

多行溢出 ,文本显示为省略号怎么写? 我想请问下,多行溢出 ,文本显示为省略号怎么写啊??555一行的可以,多行的就不行了哇~ ------解决思路----------------------用js获得一下这个div里文字的个数,当超过一定数量后substring一下,在加个...覆盖div原来的值试试貌似专门有个样式实现这个功能 忘掉了 ------解决思路----------------------设定一个宽度:设置css样式: text-overflow:ellipsis; white-s

【WP开发】加密篇:双向加密

说起双向加密,如果以前在.NET开发中弄过加/解密的朋友都不会陌生,常用的算法有DES.AES等.在RT应用程序中,也提供了加密相关的API,算法自然是一样的,只是API的封装方式不同罢了,因为RT不完全是托管代码,而又类似于COM的形式公开,这对于低端设备来说,性能可以提升,当然了,对于高端设备来说无所谓. 在WP的RT应用中,涉及到加/解密的API都在以下几个命名空间里,大家要用的就在里面找,也不是所有类都会用得上,加密一般就用两大类:需要恢复内容时选用双向加密,如DES.AES等算法:如果

C#-MVC开发微信应用(3)--文本消息和图文消息的应答

最近咨询微信的人很多,感觉这块也是一块商机,也为了演示SNF快速开发平台的优势,就用SNF快速开发平台开发出一套微信应用程序.使用<SNF.CodeGenerator>代码生成工具可以节省大量时间. 在前面两篇两篇随笔<C#-MVC开发微信应用(1)--开始使用微信接口>和<C#-MVC开发微信应用(2)--开始使用微信接口>里面,大致介绍了我微信应用的框架构建,本随笔继续介绍这一主题,介绍消息应答里面的文本应答和图文应答的过程. 我们知道,给手机用户发送响应消息,它可