一:问题出现的原因:
Silverlight 默认选择微软雅黑作为中文显示字体,若操作系统为英文操作系统(没有安装微软雅黑字体时),silverlight的中文字体会显示成如下花白的设备字体的形式。
为使各个环境下silverlight都显示相同的字体,我们需要在程序中手动指定文字的字体。
二:问题解决步骤:
Silverlight3环境:
1:建立silverlight项目,建立textblok等文字显示控件。
2:在blend3中为控件设置字体样式:
选中一种字体之后,勾选字体面板下面的Embed复选框即可将指定字体打包到Silverlight工程中去。这个时候工程中自动生成了Fonts文件夹,里面放置了宋体这个字体文件。
3:修改自动生成代码中的字体名称(如宋体改为SimSun);
如上操作即可打包silverlight显示字体。
Silverlight4环境:
Silverlight下已更正打包时字体名称中文显示的问题,无须修改字体名称。
三:问题分析及解决问题过程:
Silverlight存在三种字体引用方式:
如果使用的字体是Silverlight内置支持的,那么无需做任何配置,直接指定FontFamily即可。内置的字体有Arial,Arial Black,Comic Sans MS,Courier New,Lucida Sans Unicode,Times New Roman,Georgia,Trebuchet MS,Verdana和Webdings。使用这些字体不依赖于客户端操作系统。
同时Silverlight也支持引用本地系统一部分字体(注意,不是全部本地字体都支持)。如Segoe UI,Symbol,Tahoma,宋体,等等。使用这些字体需要注意,其他客户端系统中可能不存在这些字体,如英文操作系统一般没有宋体。那么如果你使用了宋体那就会有问题。
如果你需要让Silverlight应用程序在不同系统下都有一致的字体,或者你想用某些字体,但是这些字体不支持本地引用(如隶书),那么Silverlight允许你将字体文件打包到应用程序中,可以放在Xap包中,也可以放在ClientBin目录下,然后在代码中动态下载并引用这些字体文件。这样牺牲的代价就是Xap包会变得较大。
为了更好显示中文,我需要为上面的文字显式指定使用“宋体”。代码如下:
<Grid x:Name="LayoutRoot" Background="White"> <TextBlock Text="Hello,测试中英文混合显示效果" FontSize="26" FontFamily="宋体"/> </Grid>
Ctrl+F5运行,却发现字体没有发生明显的变化。说明字体的设置不起作用。我又测试了一下将宋体打包到应用程序中。为了简单,我使用Blend3帮我自动完成这个操作。
选中一种字体之后,勾选字体面板下面的Embed复选框即可将指定字体打包到Silverlight工程中去。这个时候工程中自动生成了Fonts文件夹,里面放置了宋体这个字体文件。
同时,Xaml也发生了变化,由引用系统的宋体改成引用Fonts.zip包中的宋体了。如下:
<Grid x:Name="LayoutRoot" Background="White"> <TextBlock Text="Hello,测试中英文混合显示效果" FontSize="26" FontFamily="Fonts/Fonts.zip#宋体"/> </Grid>
运行结果发现字体依旧。
后来查阅Silverlight相关资料发现是因为字体名不规范。不能直接使用“宋体”,而应该使用Simsun。只需将上面两个示例代码中的宋体改成Simsun即可正确显示出宋体的效果来。
后来又测试了一下其它中文字体,如微软雅黑,如果直接这样写中文的话是显示不出来的,一定要写“Microsoft YaHei”。Blend3帮我自动生成的代码居然有这种莫名其妙的错(blend4已修正)。
四:问题总结
在Silverlight中,如果要引用字体,一定不能直接写上中文名称,否则不起任何作用。如果你是在英文操作系统下的话,你可以打开字体文件(C:\windows\fonts文件夹下,Silverlight支持ttf,odttf和otf这几种后缀的字体文件),其中的字体名称一栏就是FontFamily所使用的名称。只是在中文操作系统下,支持中文的字体在这里会显示为中文名,而不是英文名。
常见中文字体名和英文字体名的对应关系如下:
常见中文字体与FontFamily映射表 | |
宋体(英文不等宽) | Simsun |
宋体(英文等宽) | NSimsun |
楷体 | KaiTi |
黑体 | SimHei |
仿宋 | FangSong |
微软正黑体 | Microsoft JhengHei |
细明体 | MingLiu |
微软雅黑 | Microsoft YaHei |
隶书 | LiSu(只能打包,不支持本地系统引用) |
华文彩云 | STCaiyun(只能打包,不支持本地系统引用) |
华文琥珀 | STHupo(只能打包,不支持本地系统引用) |
华文隶书 | STLiti(只能打包,不支持本地系统引用) |
华文新魏 | STXinwei(只能打包,不支持本地系统引用) |
华文行楷 | STXingkai(只能打包,不支持本地系统引用) |
幼圆 | YouYuan(只能打包,不支持本地系统引用 |