windows phone的默认字体是Segoe WP(Segoe UI), 但是这个字体包含的字符非常少, 在WP7里, 只有几十KB, 虽然在WP8增加了很多字符, 但是还是很难满足开发的应用.
开发过程中, 如果需要显示一些特殊字符, 类似于表情, 颜文字等, 如果直接使用Segoe字体, 或者系统自带的字体, 会不能正常显示, 都显示成了口口. 比如: ಥ_ಥ ಠ_ರೃ 这些.
示例代码:
<TextBlock TextWrapping="Wrap" Text="你好世界(゚∀゚)ಥ_ಥಠ_ರ" />
截图:
解决办法:
嵌入自定义字体.
在visual studio中, 添加一个ttf字体, 并将生成操作改成: 内容
代码:
<TextBlock
FontFamily="/FontTest;component/Fonts/Nirmala.ttf#Nirmala UI"
Text="你好世界(゚∀゚)ಥ_ಥಠ_ರ" />
注意,
FontFamily必须是带组件名的完整路径.(好像有时候也不用是完整路径..试一试吧..
或者, 使用Blind:
1. 选择控件, 查看属性, 选择一个字体, 然后勾选"嵌入":
Blend生成的代码:
<TextBlock TextWrapping="Wrap" Text="你好世界(゚∀゚)ಥ_ಥಠ_ರ"
FontFamily="/FontTest;component/Fonts/Fonts.zip#Nirmala UI" />
还有更优雅的写法: 定义一个FontFamily资源, 把字体放进去, 然后需要的时候, 直接设置一下就可以了.
<!--应用程序资源-->
<Application.Resources>
<!--<FontFamily x:Key="FontFamily">
Fonts/Nirmala.ttf#Nirmala UI,
Fonts/SegoeWP.ttf#Segoe WP
</FontFamily>-->
<FontFamily x:Key="FontFamily">
/FontTest;component/Fonts/Fonts.zip#Segoe WP,
/FontTest;component/Fonts/Fonts.zip#Nirmala UI
</FontFamily>
</Application.Resources>
第一种是VS的写法, 第二种是Blend的写法.
使用方式:
<TextBox Text="ಥ_ಥ" FontFamily="{StaticResource FontFamily}" />
或者直接定义一个Style:
<ScrollViewer.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontFamily" Value="{StaticResource FontFamily}" />
</Style>
</ScrollViewer.Resources>
说明和注意事项:
0. WP8不支持雅黑字体, 默认只有等线字体. 如果遇到文字变成口口的情况, 可以先搜索一下这个字符的unicode码, 然后使用字符映射查找其所在的unicode区间, 看看是不是存在于你的字体中. 推荐使用Code2000或者Arial unicode的字体, 基本包含了所有的unicode字符, 但是文件体积也比较大. 而且Code2000的中文字体很难看..所以最好是放在最后面.
1. 好像font family的路径必须用完整路径, 不然不管用;
2. font family bu不支持复杂控件的继承. 比如, textbox, button等. 必须手动重新定义一遍;
3. 字体格式只能是ttf格式;
4. Blend生成的字体, 编译类型是"资源", 会生成zip的压缩包, 嵌入到应用的dll里,
5. 安排好字体的使用顺序. 比如, 把Segoe放在最前, 把Code2000放在最后.
********************************************
在这里下载示例代码>> https://github.com/george674834080/WPFontTest
********************************************
参考链接:
1. Define the FontFamily as a resource in Windows Phone
2. Windows Phone 8: supports Native Unicode (Malayalam)?
来源:oschina
链接:https://my.oschina.net/u/101827/blog/145905