解決Silverlight引用中文字體的問題1

作者:網絡 來源:佚名 更新時間:2010-12-20 18:00:27 點擊:

問題描述

在Silverlight程序中,對文字設置了中文字體之后不起任何作用。

問題分析

Silverlight內置了十幾種常見拉丁字體,如Arial,Comic Sans MS,Courier New,Lucida Sans Unicode等。默認使用的字體是Portable User Interface。這是一種復合字體,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”。可惡的Blend,幫我自動生成的代碼居然有這種莫名其妙的錯。不知道這算是Silverlight和Blend的Bug還是設計使然。

總結

在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(只能打包,不支持本地系統引用

大乐透走势图2 幸运赛车app上万购彩wgc03 哪些时时彩平台是真的 天津时时彩历史开奖 云南11选5走势图 广西快三app官方 分分彩输得我好惨 北京时时彩官网平 东方6 1最高奖金是多少 北京pk拾稳赚技巧6 排列三综合走势图 舟山飞鱼直播走势图片 万达游戏平台登录网址 百度彩票网 中国福利彩票安装 买福利彩票怎么选号码 信誉棋牌游戏评测网站