另類的silverlight中文解法
文/黃忠成
如你所知,由於字型的關係,
silverlight
目前對於雙位元文字顯示可說是困難重重,大概可歸類出兩種解法,一種是下載字型到客戶端,一種是利用
blend2
將文字變成圖形,下載字型目前有法律問題的隱憂,而且乙個中文字庫大小約
5mb,仍嫌過大。在上次嘗試實作
databinding
功能後,心中就有一種想法,假如於
server
端將文字轉成圖形後下載到客戶端,那麼因為不是直接下載字型,所以應無法律問題
(這我不確定!
),也不會因下載整個字型檔而導致網頁開啟速度過慢,這樣是否就能讓前次的
data bindigns
例子支援中文的顯示呢?可惜前幾天因陪老婆考試,一直沒時間來實現心中的構想,這幾天終於有時間來實現這個架構了。基本上,實現這個架構有兩個問題必須先行解決,第乙個問題是
server
端如何將文字變成圖形?這不難,下列的程式便可辦到。
protected
void page_load(object sender, eventargs e)
else
if (request.querystring["transform"] != null)
else
response.end();}}
}private
void resolveparams(string transformparams, out
int index, out
string column)
}private
memorystream resolvetransform(object data, string column)
private
memorystream getdbcsjpestream(string str, font font, color forecolor,
color
background, int width, int height)
如果你仔細看上面的程式,會發覺其中有字型預設的問題,若要以此觀念實作乙個完整的架構,關於字型的資訊應於
xaml
中指定才好,不過目前我只是展示這個想法的可行性,就先放著這部份不理了。第二個要解決的問題是如何於
xaml
中指定data bindings
資訊,這點不難,依據前版以
tag來指定
binding expression
的概念,只需加油添醋一番,即可套用。
請注意,由於採圖形方式的緣故,這裡已不再使用
textblock
,而是使用
image
控制項來顯示,
sldh.js
也需稍做修改。 /
// silverlight data binding helper 0.1
/if(!window.silverlightbinding)
window.silverlightbinding = {};
silverlightbinding.bindingdata = function(ctrl,bindingexpression,context)
if(temp[0] == 'bindingfield')
this.bindingfield = temp[1];
else
if(temp[0] == 'bindingproperty')
this.bindingproperty = temp[1];
else
if(temp[0] == 'format')
this.format = temp[1];
}this.bindingcomplete = true;
}silverlightbinding.bindingdata.prototype =
',dataitem."+this.bindingfield+');');
if(this.format.indexof("index") != -1)
str = str.replace("",this.context.currentdataindex);
if(this.format.indexof("bindingfield") != -1)
str = str.replace("",this.bindingfield);
eval('this.ctrl.'+this.bindingproperty+" = str;");
}else
eval('this.ctrl.'+this.bindingproperty+' = dataitem.'+this.bindingfield+';');}}
}silverlightbinding.bindingcontext = function(bindingcontainer)}}
if(!this.bindingcomplete) alert('error,binding failed.');
}silverlightbinding.bindingcontext.prototype =
else
delete bindingdata;
}try
catch(err)
for(var i = 0; i < parent.children.count; i++)
this._childworker(parent.children.getitem(i),true);
}
},initialize:function()
,onsucceeded: function(result, usercontext, methodname)
else
if(methodname == usercontext.bindingcountmethod)
usercontext.recordcount = result;
},
onfailed:function(error, usercontext, methodname)
},_receivedata: function(index)
,_receivecount: function()
,next:function()
,prev:function()
}下圖為執行例。
後記
這種方式僅是乙個應急的解法,畢竟傳輸圖形也是需要時間的,自然不比直接使用位於客戶端的字型來的有效率。
示例下載:
另類的Silverlight中文解法
另類的silverlight中文解法 文 黃忠成 如你所知,由於字型的關係,silverlight 目前對於雙位元文字顯示可說是困難重重,大概可歸類出兩種解法,一種是下載字型到客戶端,一種是利用 blend2 將文字變成圖形,下載字型目前有法律問題的隱憂,而且乙個中文字庫大小約 5mb,仍嫌過大。在...
另類的Silverlight中文解法
另類的silverlight中文解法 文 黃忠成 如你所知,由於字型的關係,silverlight 目前對於雙位元文字顯示可說是困難重重,大概可歸類出兩種解法,一種是下載字型到客戶端,一種是利用 blend2 將文字變成圖形,下載字型目前有法律問題的隱憂,而且乙個中文字庫大小約 5mb,仍嫌過大。在...
另類的Silverlight中文解法
另類的silverlight中文解法 文 黃忠成 如你所知,由於字型的關係,silverlight 目前對於雙位元文字顯示可說是困難重重,大概可歸類出兩種解法,一種是下載字型到客戶端,一種是利用 blend2 將文字變成圖形,下載字型目前有法律問題的隱憂,而且乙個中文字庫大小約 5mb,仍嫌過大。在...