TWaver - 專注UI技術(shù)

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          隨著最近TWaver .NET的正式發(fā)布,有不少使用過TWaver的Java,Web或Flex的老客戶也可以嘗試在項(xiàng)目中使用TWaver .NET,雖然TWaver .NET既有TWaver.Wpf.dll又有TWaver.Silverlight.dll兩個(gè)開發(fā)包,同時(shí)支持WPF和Silverlight兩種方式,用戶可以根據(jù)自己需要任意挑選,不過根據(jù)我們最近走訪全國(guó)各地目前使用TWaver .NET的僅二十家客戶統(tǒng)計(jì),采用Silverlight的解決方案比例還是居多,雖然WPF功能更加強(qiáng)大,但畢竟Silverlight通過很輕量的6m多插件就可以跑在windows,mac甚至是 symbianwindows phone 7 的mobile領(lǐng)域,發(fā)布如此輕量,更新如此輕松,部署如此廣泛,何樂而不為呢。

          扯遠(yuǎn)了,回到今天主題,不少用過TWaver其他版本的老客戶常抱怨,TWaver其他版本總是那么如此讓人省心,讓我們體驗(yàn)到開發(fā)GUI真的也能做到Don’t Repeat Yourself (DRY) ,為什么TWaver .NET上注冊(cè)圖片需要我提供width和height信息TWaver.Utils.RegisterImageByImageSource(string name, ImageSource imageSource, double width, double height)呢,這問題要怪應(yīng)該怪微軟,為什么Silverlight上非得將Image綁定上source并且真是display出來后才能真的得到width和height信息,當(dāng)組件還沒呈現(xiàn)時(shí)你去獲取image的寬高只能得到0。

          在此我替微軟向去年當(dāng)TWaver .NET還在beta中就已經(jīng)開始在項(xiàng)目中預(yù)言和使用客戶道歉,我們沒有徹底做到DRY,不過始終堅(jiān)持最大程序減少用戶工作量原則的TWaver開發(fā)團(tuán)隊(duì),在正式TWaver .NET 1.0發(fā)布時(shí)提供了讓人更舒心的RegisterPNGImage(string name, Uri uri)函數(shù),是的,你不用在告訴TWaver寬高了,TWaver會(huì)自動(dòng)的去獲取,至于如何獲取很多同學(xué)很感興趣,以下實(shí)現(xiàn)代碼原理很簡(jiǎn)單我就不解釋了,總之條條道路通羅馬,Silverlight不提供的我們也能走出自己的路

           1        internal static void RegisterPNGImage(string name, Uri uri)
           2        {
           3            StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
           4            if (resourceInfo != null && resourceInfo.Stream != null)
           5            {
           6                BitmapImage image = new BitmapImage();
           7#if SILVERLIGHT
           8                image.SetSource(resourceInfo.Stream);
           9#else
          10                image.BeginInit();
          11                image.StreamSource = resourceInfo.Stream;
          12                image.EndInit();
          13#endif
          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
          25                {
          26                    byte[] buffer = new byte[16];
          27                    resourceInfo.Stream.Read(buffer, 0, buffer.Length);
          28                    Array.Reverse(buffer, 84);
          29                    Array.Reverse(buffer, 124);
          30
          31                    double width = BitConverter.ToInt32(buffer, 8);
          32                    double height = BitConverter.ToInt32(buffer, 12);
          33
          34                    resourceInfo.Stream.Close();
          35                    ImageUtils.RegisterImageAsset(name, new ImageAsset(image, width, height));
          36
          37                    return;
          38                }

          39                resourceInfo.Stream.Close();
          40            }

          41            new Exception("Can not load PNG Image '" + name + "' URI: " + uri);
          42        }

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 陇川县| 浦城县| 古交市| 蒙阴县| 河曲县| 沅陵县| 辽阳市| 晋江市| 永福县| 黄平县| 府谷县| 城口县| 郁南县| 泰安市| 南城县| 涿州市| 松桃| 曲靖市| 丹棱县| 汤阴县| 丽水市| 永宁县| 乳山市| 彩票| 渭源县| 新丰县| 抚顺市| 茶陵县| 上栗县| 蓬安县| 疏附县| 长葛市| 马关县| 宣武区| 阿拉善左旗| 建瓯市| 长汀县| 红安县| 渝中区| 筠连县| 高要市|