且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Silverlight 5 beta新特性探索系列:3.Silverlight5中的文字增进控制【附带实例源码】

更新时间:2022-06-17 17:22:40

在Silverlight 5中新增了CharacterSpacing属性对文字间距进行控制,增加了RichTextBoxOverflow控件以灵活的对大量文字进行合理的排版显示。

一、CharacterSpacing属性

在Silverlight原来的版本中文字和文字之间并没有一个间距控制属性,这让某一些特殊的文字显示场合排版不易(比如杂志,电子报),在Silverlight 5中引入的CharacterSpacing属性就可以很好处理文字间距,它可用做TextBlock,RichTextBox,Label等文字控件,其具体文字间隔像素计算公式如下:字体大小*CharacterSpacing值/1000=字符间距像素值。比如:10号的字体,CharacterSpacing设置为500那么字符之间的间距=10*500/1000=5像素。现在我们通过以下XAML代码来看看如何设置CharacterSpacing属性:

<sdk:Label CharacterSpacing="200" Content="第一个LABEL控件" Height="28" Name="label1" 
 HorizontalAlignment="Left" Margin="221,660,0,0" VerticalAlignment="Top" Width="156" />
<sdk:Label CharacterSpacing="500" Content="第一个LABEL控件" Height="28" Name="label2" 
 HorizontalAlignment="Left" Margin="393,660,0,0" VerticalAlignment="Top" Width="156" />
<sdk:Label CharacterSpacing="-100" Content="第一个LABEL控件" Height="28" Name="label3"
 HorizontalAlignment="Left" Margin="583,660,0,0" VerticalAlignment="Top" Width="156" />

显示出来的具体效果如下:

Silverlight 5 beta新特性探索系列:3.Silverlight5中的文字增进控制【附带实例源码】

二、RichTextBoxOverflow控件

在Silverlight 5中也引入了另外一个控件来支持复杂的文字排版:RichTextBoxOverflow控件,他将显示溢出RichTextBox显示区域的文字,如果RichTextBox的文字内容过多,则将多余的文字显示到OverflowContentTarget属性绑定到的RichTextBoxOverflow控件中去,如:OverflowContentTarget="{Binding ElementName=Rflow1}",如果一个这个RichTextBoxOverflow控件还是显示不完,则可以将多余的文字显示进入下一个OverflowContentTarget指定的RichTextBoxOverflow控件中去。下面我们来通过一个实例来看看如何使用RichTextBoxOverflow控件。

<RichTextBox HorizontalAlignment="Left" BorderThickness="0" Margin="12,0,0,0"
 Name="richTextBox1" VerticalAlignment="Top" Width="137"
 OverflowContentTarget="{Binding ElementName=Rflow1}" Height="697">
 <Paragraph>  惊蛰一过,春寒加剧。先是料料峭峭,继而雨季开始,时而淋淋漓漓,时而淅淅沥沥,天潮潮地湿湿,即连在梦里,也似乎有把伞撑着。而就凭一把伞,躲过一阵潇潇的冷雨,也躲不过整个雨季。连思想也都是潮润润的。每天回家,曲折穿过金门街到厦门街迷宫式的长巷短巷,雨里风里,走入霏霏令人更想入非非。想这样子的台北凄凄切切完全是黑白片的味道,想整个中国整部中国的历史无非是一张黑白片子,片头到片尾,一直是这样下着雨的。这种感觉,不知道是不是从安东尼奥尼那里来的。不过那—块土地是久违了,二十五年,四分之一的世纪,即使有雨,也隔着千山万山,千伞万伞。十五年,一切都断了,只有气候,只有气象报告还牵连在一起,大寒流从那块土地上弥天卷来,这种酷冷吾与古大陆分担。不能扑进她怀里,被她的裙边扫一扫也算是安慰孺慕之情吧。</Paragraph>
 <Paragraph>  这样想时,严寒里竟有一点温暖的感觉了。这样想时,他希望这些狭长的巷子永远延伸下去,他的思路也可以延伸下去,不是金门街到厦门街,而是金门到厦门。他是厦门人,至少是广义的厦门人,二十年来,不住在厦门,住在厦门街,算是嘲弄吧,也算是安慰。不过说到广义,他同样也是广义的江南人,常州人,南京人,川娃儿,五陵少年。杏花春雨江南,那是他的少年时代了。再过半个月就是清明。安东尼奥尼的镜头摇过去,摇过去又摇过来。残山剩水犹如是,皇天后土犹如是。纭纭黔首、纷纷黎民从北到南犹如是。那里面是中国吗?那里面当然还是中国永远是中国。只是杏花春雨已不再,牧童遥指已不再,剑门细雨渭城轻尘也都已不再。然则他日思夜梦的那片土地,究竟在哪里呢?在报纸的头条标题里吗?还是***的谣言里?还是傅聪的黑键白键马恩聪的跳弓拨弦?还是安东尼奥尼的镜底勒马洲的望中?还是呢,故宫博物院的壁头和玻璃柜内,京戏的锣鼓声中太白和东坡的韵里?杏花,春雨,江南。六个方块字,或许那片土就在那里面。而无论赤县也好神州也好中国也好,变来变去,只要仓颉的灵感不灭,美丽的中文不老,那形象那磁石一般的向心力当必然长在。因为一个方块字是一个天地。太初有字,于是汉族的心灵他祖先的回忆和希望便有了寄托。譬如凭空写一个“雨”字,点点滴滴,滂滂沱沱,淅淅沥沥,一切云情雨意,就宛然其中了。视觉上的这种美感,岂是什么rain也好pluie也好所能满足?翻开一部《辞源》或《辞海》,金木水火土,各成世界,而一入“雨”部,古神州的天颜千变万化,便悉在望中,美丽的霜雪云霞,骇人的雷电霹雹,展露的无非是神的好脾气与坏脾气,气象台百读不厌门外汉百思不解的百科全书。</Paragraph>
 <Paragraph>  听听,那冷雨。看看,那冷雨。嗅嗅闻闻,那冷雨,舔舔吧,那冷雨。雨在他的伞上这城市百万人的伞上雨衣上屋上天线上,雨下在基隆港在防波堤海峡的船上,清明这季雨。雨是女性,应该最富于感性。雨气空而迷幻,细细嗅嗅,清清爽爽新新,有一点点薄荷的香味,浓的时候,竟发出草和树林之后特有的淡淡土腥气,也许那竟是蚯蚓的蜗牛的腥气吧,毕竟是惊蛰了啊。也许地上的地下的生命也许古中国层层叠叠的记忆皆蠢蠢而蠕,也许是植物的潜意识和梦紧,那腥气。</Paragraph>
 <Paragraph>  第三次去美国,在高高的丹佛他山居住了两年。美国的西部,多山多沙漠,千里干旱,天,蓝似安格罗萨克逊人的眼睛,地,红如印第安人的肌肤,云,却是罕见的白鸟,落基山簇簇耀目的雪峰上,很少飘云牵雾。一来高,二来干,三来森林线以上,杉柏也止步,中国诗词里“荡胸生层云”或是“商略黄昏雨”的意趣,是落基山上难睹的景象。落基山岭之胜,在石,在雪。那些奇岩怪石,相叠互倚,砌一场惊心动魄的雕塑展览,给太阳和千里的风看。那雪,白得虚虚幻幻,冷得清清醒醒,那股皑皑不绝一仰难尽的气势,压得人呼吸困难,心寒眸酸。不过要领略“白云回望合,青露入看无”的境界,仍须来中国。***湿度很高,最饶云气氛题雨意迷离的情调。两度夜宿溪头,树香沁鼻,宵寒袭肘,枕着润碧湿翠苍苍交叠的山影和万缀都歇的俱寂,仙人一样睡去。山中一夜饱雨,次晨醒来,在旭日未升的原始幽静中,冲着隔夜的寒气,踏着满地的断柯折枝和仍在流泻的细股雨水,一径探入森林的秘密,曲曲弯弯,步上山去。溪头的山,树密雾浓,蓊郁的水气从谷底冉冉升起,时稠时稀,蒸腾多姿,幻化无定,只能从雾破云开的空处,窥见乍现即隐的一峰半堑,要纵览全貌,几乎是不可能的。至少上山两次,只能在白茫茫里和溪头诸峰玩捉迷藏的游戏。回到台北,世人问起,除了笑而不答心自问,故作神秘之外,实际的印象,也无非山在虚无之间罢了。云绦烟绕,山隐水迢的中国风景,由来予人宋画的韵味。那天下也许是赵家的天下,那山水却是米家的山水。而究竟,是米氏父子下笔像中国的山水,还是中国的山水上只像宋画,恐怕是谁也说不清楚了吧?</Paragraph>
 <Paragraph>  雨不但可嗅,可亲,更可以听。听听那冷雨。听雨,只要不是石破天惊的台风暴雨,在听觉上总是一种美感。大陆上的秋天,无论是疏雨滴梧桐,或是骤雨打荷叶,听去总有一点凄凉,凄清,凄楚,于今在岛上回味,则在凄楚之外,再笼上一层凄迷了,饶你多少豪情侠气,怕也经不起三番五次的风吹雨打。一打少年听雨,红烛昏沉。再打中年听雨,客舟中江阔云低。三打白头听雨的僧庐下,这更是亡宋之痛,一颗敏感心灵的一生:楼上,江上,庙里,用冷冷的雨珠子串成。十年前,他曾在一场摧心折骨的鬼雨中迷失了自己。雨,该是一滴湿漓漓的灵魂,窗外在喊谁。</Paragraph>
</RichTextBox>
<RichTextBoxOverflow Name="Rflow1" BorderThickness="0" Margin="155,0,0,577"
 OverflowContentTarget="{Binding ElementName=Rflow2}" />
<RichTextBoxOverflow Name="Rflow2" BorderThickness="0" Margin="517,129,0,319"
 OverflowContentTarget="{Binding ElementName=Rflow3}" />
<RichTextBoxOverflow Name="Rflow3" BorderThickness="0" Margin="155,387,0,41" />
<Ellipse Height="252" HorizontalAlignment="Left" Fill="Green" 
 Margin="165,129,0,0" Name="ellipse1" Stroke="Black" 
 StrokeThickness="1" VerticalAlignment="Top" Width="346" />

Tips:如果想要在每一段落的开头留两个空格可以在段落开头输入两个中文全角的空格符如例所示。

本实例采用VS2010+Silverlight 5 beta编写,如需源码点击 SL5RichTextBox.zip 下载。具体的运行效果如下图所示:

Silverlight 5 beta新特性探索系列:3.Silverlight5中的文字增进控制【附带实例源码】