代码改变世界

silverlight显示中文字(二):使用TextBlock+Downloader

2008-02-18 16:39  敏捷的水  阅读(1161)  评论(0编辑  收藏  举报

(一),建立一个Silverlight1.0 site.

image

(二)修改page.xaml为如下内容

<Canvas xmlns="http://schemas.microsoft.com/client/2007"
        xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
<!-- 進度列指示器 -->
    
<Canvas x:Name="ProgressIndicator" Canvas.Left="10"
       Canvas.Top
="10" Canvas.ZIndex="1">
        
<Rectangle x:Name="progressRectangle"
          Canvas.Left
="10"
          Height
="10" Width="0"
          Fill
="Maroon" />
        
<Rectangle
          
Canvas.Top ="-1"
          Canvas.Left
="9" Height="12"
          Width
="202"
          StrokeThickness
="1" Stroke="Black" />
        
<TextBlock
          
x:Name="progressText"
          Canvas.Top 
="-4" Canvas.Left="230"
          Text
="0%" FontSize="12" />
    
</Canvas>
    
<Canvas Name="myCanvas" Background="LightBlue" Width="600"
       Height
="400" Canvas.Top="0"  Canvas.ZIndex="0" >
          
<TextBlock Name="myTextBlock"
            TextWrapping
="Wrap"  Width="343" FontSize="30"
            Canvas.Top
="100" Canvas.Left="100" Loaded="handleLoad" Height="150.1"
                     Text
="国足继续恐韩">
        
</TextBlock>
    
</Canvas>
</Canvas>

(3)

在page.xaml.js否面加入如下内容

      

     var delegate1;
  
var delegate2;
  
// Loaded 事件处理程序。
  function handleLoad(sender, eventArgs)
  
{
  
// 取得Silverlight Plugin对象
  var slPlugin = sender.getHost();
  
// 申明Downloader 对象
  var downloader = slPlugin.createObject("downloader");
  
// 申明DownloadProgressChanged与Completed 事件委托
  delegate1= downloader.addEventListener("downloadProgressChanged", onDownloadProgressChanged);
  delegate2
= downloader.addEventListener("completed", onCompleted);
  
// 初始化下载要求
  downloader.open("GET""simhei.zip");
  
//下载未压缩的TTF字型也可以
  //downloader.open("GET", "simhei.ttf");
  // 开始下载
  downloader.send();
  }

  
// Completed 事件处理常式
  function onCompleted(sender, eventArgs)
  
{
  
// 移除DownloadProgressChanged 事件与其事件处理程序的委托
  sender.removeEventListener("downloadProgressChanged", delegate1);
  
// 移除Completed 事件与其事件处理常式的委托
  sender.removeEventListener("completed", delegate2);
  
var textblock = sender.findName("myTextBlock");
  textblock.setFontSource(sender);
  textblock.fontFamily
="SimHei";
  
//将Downloader对象设定为null
  sender = null;
  }

  
// 更新进度条
  function onDownloadProgressChanged(sender, eventArgs)
  
{
  
var progressText = sender.findName("progressText");
  
var progressRectangle = sender.findName("progressRectangle");
  
// 计算下载的百分比
  var percentage = Math.floor(sender.downloadProgress * 100);
  
// 更新进度条的Rectangle 与TextBlock 对象
  progressText.text = percentage + "%";
  progressRectangle.width 
= percentage * 2;
  }

(4) 压缩完整的simHei.ttf为simHei.zip,拷贝到项目的目录

(5)选择Test.site,先看到下面的第一章图,等下载完后,就会显示正常了

image

image

有朋友问了,那能不能只下载部分使用的字体呢? 我想是可以的,但是按照之前的方法却怎么也显示不出来,那位朋友知道是什么原因,麻烦告诉我一生,谢谢。

还有当我创建Silver Light Application(Orcas)项目,也就是1.1的项目时,不管是完整的,部分的都不行。