概述:不少用过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@ldacury.cn
												文章转载自:网络转载