首页 > Silverlight > 解决Silverlight引用中文字体的问题

解决Silverlight引用中文字体的问题

Silverlight

问题描述

在Silverlight程序中,对文字设置了中文字体之后不起任何作用。

问题分析

Silverlight内置了十几种常见拉丁字体,如Arial,Comic Sans MS,Courier New,Lucida Sans Unicode等。默认使用的字体是Portable User Interface。这是一种复合字体,Silverlight会根据文字的语言选择最佳的字体。但是,这种字体通常在显示中文的时候非常难看。下图是默认的显示效果:

image

所以,我们需要在程序中手动指定文字的字体。

三种字体引用方式

如果使用的字体是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帮我自动完成这个操作。

Blend 3中字体打包

选中一种字体之后,勾选字体面板下面的Embed复选框即可将指定字体打包到Silverlight工程中去。这个时候工程中自动生成了Fonts文件夹,里面放置了宋体这个字体文件。

Visual Studio 打包字体

同时,Xaml也发生了变化,由引用系统的宋体改成引用Fonts.zip包中的宋体了。如下:

<Grid x:Name="LayoutRoot" Background="White">
    <TextBlock Text="Hello,测试中英文混合显示效果" FontSize="26" FontFamily="Fonts/Fonts.zip#宋体"/>
</Grid>

运行结果发现字体依旧。

后来查阅Silverlight官方文档的时候,看到字体列表一节时,突然想到,是不是因为字体名不规范?不能直接使用“宋体”,而应该使用Simsun。赶紧测试了一下,发现果然是这个问题。只需将上面两个示例代码中的宋体改成Simsun即可正确显示出宋体的效果来。

image

后来又测试了一下其它中文字体,如微软雅黑,如果直接这样写中文的话是显示不出来的,一定要写“Microsoft YaHei”。可恶的Blend,帮我自动生成的代码居然有这种莫名其妙的错。不知道这算是Silverlight和Blend的Bug还是设计使然。

总结

在Silverlight中,如果要引用字体,一定不能直接写上中文,否则不起任何作用。如果你是在英文操作系统下的话,你可以打开字体文件(C:\windows\fonts文件夹下,Silverlight支持ttf,odttf和otf这几种后缀的字体文件),其中的字体名称一栏就是FontFamily所使用的名称。只是在中文操作系统下,支持中文的字体在这里会显示为中文名,而不是英文名。

FontFamily

常见中文字体名和英文字体名的对应关系如下:

常见中文字体与FontFamily映射表
宋体(英文不等宽) Simsun
宋体(英文等宽) NSimsun
楷体 KaiTi
黑体 SimHei
仿宋 FangSong
微软正黑体 Microsoft JhengHei
细明体 MingLiu
微软雅黑 Microsoft YaHei
隶书 LiSu(只能打包,不支持本地系统引用)
华文彩云 STCaiyun(只能打包,不支持本地系统引用)
华文琥珀 STHupo(只能打包,不支持本地系统引用)
华文隶书 STLiti(只能打包,不支持本地系统引用)
华文新魏 STXinwei(只能打包,不支持本地系统引用)
华文行楷 STXingkai(只能打包,不支持本地系统引用)
幼圆 YouYuan(只能打包,不支持本地系统引用)

——Kevin Yang

本博客遵循CC协议2.5,即署名-非商业性使用-相同方式共享
写作很辛苦,转载请注明作者以及原文链接~
如果你喜欢我的文章,你可以订阅我的博客:-D点击订阅我的文章

  1. k
    | #1

    我也遇到这样的问题,解释比较明白;知道应该点做了

  1. 暂时没有trackbacks.