[Web服务器控件] - ImageSlide(一)

 

这是一个服务器端控件,vs2005/.net2.0开发。该控件通过服务器端程序,将指定(磁盘或http)的图片进行裁切后,讲图片、缩略图地址及javascript代码返回到客户端,并在浏览器中构建一个动画(淡出淡入)方式切换的图片轮显单元。

服务器端文件包含一份图片裁切代码(ThumbMaker.cs)和一份服务器控件构建代码(ImageSlide.cs)。先从简单的ThumbMaker说起:

WEB要显示的图片,必须有一个实体。或者说,服务器上必须存在那样一个文件。并且我比较讲究效果,并不想直接显示原图,所以,处理后的图片,必须要保存到服务器端。ThumbMaker就是做这个工作的,它可以处理两类文件:本地的,和HTTP的。本地不必多讲了,http图片就是先下载保存本地,而后按本地图片处理。判断的方式是使用URI。

if (uri.IsFile)
{
    FileInfo fi 
= new FileInfo(url);
    
//other code  
}
else
{
    
using (MK.Download d = new Download(uri))
    {
        d.Get();
        Image i 
= Image.FromStream(d.ResultStream);
        
//other code
    }

} 

下载和图片处理的程序都写成工具封装了,所以这份代码主要是处理url格式、判断web文件夹物理位置和创建文件夹等等一些周边的工作。

再说ImageSlide.cs

public class ImageSlide : WebControl, INamingContainer

继承INamingContainer,是为了在页面上拖拽多个控件时自动区别命名。

首先定义几个布局方面所需的属性

Code

由于一张图片包括服务器位置(或http地址)、说明文字及字数超长限制、文字颜色、大图尺寸、小图尺寸等多个属性,所以定义了一个ImageItem对象,来集中存储所有这些信息。下面是这个子类的完整代码,非常简单的一个隐藏的控件。

Code

下面是一个稍微复杂的问题,就是以集合的方式在ImageSilde内存储ImageItem。不过随着时间推移,现在类似的文章越来越多了,其实也很容易GOOGLE到答案。不过那些文章大部分是用ArrayList来存储。出于C#类型安全的初衷,我使用泛型来存储集合。

下面是ImageSlide中的ImageItem集合设置:

private List<ImageItem> _ImageItemList;
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[Editor(
typeof(System.ComponentModel.Design.CollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
[NotifyParentProperty(
true)]
public List<ImageItem> ImageItemList
{

    
get
    {
        
if (_ImageItemList == null) { _ImageItemList = new List<ImageItem>(); }
        
return _ImageItemList;
    }
}

关键部分的内容,就是这些了。下一篇讲叙述该控件的js部分的内容。

posted @ 2009-04-22 11:36  MKing's Kindom  阅读(561)  评论(2编辑  收藏  举报