概述:不少用過TWaver其他版本的老客戶常抱怨,TWaver其他版本總是那么如此讓人省心,讓我們體驗到開發GUI真的也能做到 Don’t Repeat Yourself (DRY) ,為什么TWaver .NET上注冊圖片需要我提供width和height信息 TWaver.Utils.RegisterImageByImageSource(string name, ImageSource imageSource, double width, double height)呢
隨著最近TWaver .NET的正式發布,有不少使用過TWaver的Java,Web或Flex的老客戶也可以嘗試在項目中使用TWaver .NET,雖然TWaver .NET既有TWaver.Wpf.dll又有TWaver.Silverlight.dll兩個開發包,同時支持WPF和Silverlight兩種方式,用戶可以根據自己需要任意挑選,不過根據我們最近走訪全國各地目前使用TWaver .NET的僅二十家客戶統計,采用Silverlight的解決方案比例還是居多,雖然WPF功能更加強大,但畢竟Silverlight通過很輕量的6m多插件就可以跑在windows,mac甚至是 symbian和windows phone 7 的mobile領域,發布如此輕量,更新如此輕松,部署如此廣泛,何樂而不為呢。
扯遠了,回到今天主題,不少用過TWaver其他版本的老客戶常抱怨,TWaver其他版本總是那么如此讓人省心,讓我們體驗到開發GUI真的也能做到Don’t Repeat Yourself (DRY) ,為什么TWaver .NET上注冊圖片需要我提供width和height信息TWaver.Utils.RegisterImageByImageSource(string name, ImageSource imageSource, double width, double height)呢,這問題要怪應該怪微軟,為什么Silverlight上非得將Image綁定上source并且真是display出來后才能真的得到width和height信息,當組件還沒呈現時你去獲取image的寬高只能得到0。
在此我替微軟向去年當TWaver .NET還在beta中就已經開始在項目中預言和使用客戶道歉,我們沒有徹底做到DRY,不過始終堅持最大程序減少用戶工作量原則的TWaver開發團隊,在正式TWaver .NET 1.0發布時提供了讓人更舒心的RegisterPNGImage(string name, Uri uri)函數,是的,你不用在告訴TWaver寬高了,TWaver會自動的去獲取,至于如何獲取很多同學很感興趣,以下實現代碼原理很簡單我就不解釋了,總之條條道路通羅馬,Silverlight不提供的我們也能走出自己的路
01 |
internal static void RegisterPNGImage(string name, Uri uri) |
03 |
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri); |
04 |
if (resourceInfo != null && resourceInfo.Stream != null) |
06 |
BitmapImage image = new BitmapImage(); |
08 |
image.SetSource(resourceInfo.Stream); |
11 |
image.StreamSource = resourceInfo.Stream; |
14 |
resourceInfo.Stream.Position = 0; |
15 |
byte[] header = new byte[8]; |
16 |
resourceInfo.Stream.Read(header, 0, header.Length); |
17 |
if (header[0] == 0x89 && |
18 |
header[1] == 0x50 && // P |
19 |
header[2] == 0x4E && // N |
20 |
header[3] == 0x47 && // G |
21 |
header[4] == 0x0D && // CR |
22 |
header[5] == 0x0A && // LF |
23 |
header[6] == 0x1A && // EOF |
24 |
header[7] == 0x0A) // LF |
26 |
byte[] buffer = new byte[16]; |
27 |
resourceInfo.Stream.Read(buffer, 0, buffer.Length); |
28 |
Array.Reverse(buffer, 8, 4); |
29 |
Array.Reverse(buffer, 12, 4); |
31 |
double width = BitConverter.ToInt32(buffer, 8); |
32 |
double height = BitConverter.ToInt32(buffer, 12); |
34 |
resourceInfo.Stream.Close(); |
35 |
ImageUtils.RegisterImageAsset(name, new ImageAsset(image, width, height)); |
39 |
resourceInfo.Stream.Close(); |
41 |
new Exception("Can not load PNG Image '" + name + "' URI: " + uri); |
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載