博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Web服务器控件] - ImageSlide(一)
阅读量:4614 次
发布时间:2019-06-09

本文共 9356 字,大约阅读时间需要 31 分钟。

 

这是一个服务器端控件,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,是为了在页面上拖拽多个控件时自动区别命名。

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

ContractedBlock.gif
ExpandedBlockStart.gif
Code
[Bindable(true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"主图片宽度(px)")]
[DefaultValue(
400)]
[Localizable(
true)]
public int MainImageWidth
{
    
get
    {
        
object o = ViewState["MainImageWidth"];
        
if (o == nullreturn 400;
        
try { return (int)o; }
        
catch { return 400; }
    }
    
set
    {
        ViewState[
"MainImageWidth"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"主图片右侧间隙")]
[DefaultValue(
3)]
[Localizable(
true)]
public int MainImageMarginRight
{
    
get
    {
        
object o = ViewState["MainImageMarginRight"];
        
if (o == nullreturn 3;
        
try { return (int)o; }
        
catch { return 3; }
    }
    
set
    {
        ViewState[
"MainImageMarginRight"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"缩图间隙")]
[DefaultValue(
3)]
[Localizable(
true)]
public int ThumbImageMargin
{
    
get
    {
        
object o = ViewState["ThumbImageMargin"];
        
if (o == nullreturn 3;
        
try { return (int)o; }
        
catch { return 3; }
    }
    
set
    {
        ViewState[
"ThumbImageMargin"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"索引按钮高度")]
[DefaultValue(
20)]
[Localizable(
true)]
public Unit IndexTableHeight
{
    
get
    {
        
object o = ViewState["IndexTableHeight"];
        
if (o == nullreturn Unit.Pixel(20);
        
try { return (Unit)o; }
        
catch { return Unit.Pixel(20); }
    }
    
set
    {
        ViewState[
"IndexTableHeight"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"索引按钮高度")]
[DefaultValue(
0)]
[Localizable(
true)]
public Unit IndexTableOffset
{
    
get
    {
        
object o = ViewState["IndexTableOffset"];
        
if (o == nullreturn Unit.Pixel(0);
        
try { return (Unit)o; }
        
catch { return Unit.Pixel(0); }
    }
    
set
    {
        ViewState[
"IndexTableOffset"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"标题栏背景颜色")]
[Localizable(
true)]
public System.Drawing.Color TextBarBackColor
{
    
get
    {
        
object o = ViewState["TextBarBackColor"];
        
if (o == nullreturn System.Drawing.Color.FromArgb(0x330x330x33);
        
return (System.Drawing.Color)o;
    }
    
set
    {
        ViewState[
"TextBarBackColor"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"标题字数限制")]
[DefaultValue(
20)]
[Localizable(
true)]
public int TextLengthLimit
{
    
get
    {
        
object o = ViewState["TextLengthLimit"];
        
if (o == nullreturn 20;
        
try { return (int)o; }
        
catch { return 20; }
    }
    
set
    {
        ViewState[
"TextLengthLimit"= value;
    }
}
[Bindable(
true)]
[Category(
"MK.Control.ImageSlide")]
[Description(
"主图片容器颜色")]
[Localizable(
true)]
public System.Drawing.Color MainImageColor
{
    
get
    {
        
object o = ViewState["MainImageColor"];
        
if (o == nullreturn System.Drawing.Color.FromArgb(0xfa0xfa0xfa);
        
return (System.Drawing.Color)o;
    }
    
set
    {
        ViewState[
"MainImageColor"= value;
    }
}

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

ContractedBlock.gif
ExpandedBlockStart.gif
Code
[DesignTimeVisible(false)]
[ToolboxData(
"<{0}:ImageItem runat=server></{0}:ImageItem>")]
public class ImageItem : WebControl
{
    
private string _OriginalImageUrl = String.Empty;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public string OriginalImageUrl
    {
        
get { return _OriginalImageUrl; }
        
set { _OriginalImageUrl = value; }
    }
    
private string _ThumbImageUrl = String.Empty;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public string ThumbImageUrl
    {
        
get { return _ThumbImageUrl; }
        
set { _ThumbImageUrl = value; }
    }
    
private string _ViewImageUrl = String.Empty;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public string ViewImageUrl
    {
        
get { return _ViewImageUrl; }
        
set { _ViewImageUrl = value; }
    }
    
private string _HRef = String.Empty;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public string HRef
    {
        
get { return _HRef; }
        
set { _HRef = value; }
    }
    
private string _Text = String.Empty;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public string Text
    {
        
get { return _Text; }
        
set { _Text = value; }
    }
    
private int _TextLimit;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public int TextLimit
    {
        
get { return _TextLimit; }
        
set { _TextLimit = value; }
    }
    
public string LimitText
    {
        
get
        {
            
if (_Text.Length <= _TextLimit) return _Text;
            
return _Text.Substring(0, _TextLimit) + "";
        }
    }
    
private int _Offset;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public int Offset
    {
        
get { return _Offset; }
        
set { _Offset = value; }
    }
    
private Unit _ThumbWidth = new Unit();
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public Unit ThumbWidth
    {
        
get { return _ThumbWidth; }
        
set { _ThumbWidth = value; }
    }
    
private Unit _ThumbHeight = new Unit();
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public Unit ThumbHeight
    {
        
get { return _ThumbHeight; }
        
set { _ThumbHeight = value; }
    }
    
private Unit _ViewHeight = new Unit();
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public Unit ViewHeight
    {
        
get { return _ViewHeight; }
        
set { _ViewHeight = value; }
    }
    
private Unit _ViewWidth = new Unit();
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public Unit ViewWidth
    {
        
get { return _ViewWidth; }
        
set { _ViewWidth = value; }
    }
    
internal void Deal()
    {
        ThumbMaker.DealImageItem(
this);
    }
    
private int _TextBarOffset;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public int TextBarOffset
    {
        
get { return _TextBarOffset; }
        
set { _TextBarOffset = value; }
    }
    
private Unit _TextBarHeight;
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
public Unit TextBarHeight
    {
        
get { return _TextBarHeight; }
        
set { _TextBarHeight = value; }
    }
    [Category(
"MK.Control.ImageSlide.ImageItem")]
    
private System.Drawing.Color _TextBarBackColor = System.Drawing.Color.FromArgb(0x330x330x33);
    
public System.Drawing.Color TextBarBackColor
    {
        
get
        {
            
return _TextBarBackColor;
        }
        
set
        {
            _TextBarBackColor 
= value;
        }
    }
    
private HtmlAnchor _ViewImage;
    
internal HtmlAnchor ViewImage
    {
        
get
        {
            
if (_ViewImage == null) _ViewImage = new HtmlAnchor();
            
if (_ViewImageUrl != String.Empty)
            {
                HtmlImage hi 
= new HtmlImage();
                hi.Src 
= _ViewImageUrl;
                hi.Style[HtmlTextWriterStyle.BorderWidth] 
= "0px";
                HtmlGenericControl textBar 
= new HtmlGenericControl("div");
                textBar.InnerText 
= LimitText;
                textBar.Style[HtmlTextWriterStyle.Height] 
= _TextBarHeight.ToString();
                textBar.Style[HtmlTextWriterStyle.Width] 
= String.Format("{0}px", (int)(_ViewWidth.Value - 5));
                textBar.Style[HtmlTextWriterStyle.Position] 
= "relative";
                textBar.Style[HtmlTextWriterStyle.MarginTop] 
= String.Format("-{0}px", _TextBarOffset);
                textBar.Style[HtmlTextWriterStyle.BackgroundColor] 
= System.Drawing.ColorTranslator.ToHtml(_TextBarBackColor);
                textBar.Attributes.Add(
"class""ImageSlite_TitleBar");
                _ViewImage.Controls.Add(hi);
                _ViewImage.Controls.Add(textBar);
                _ViewImage.HRef 
= HRef;
                _ViewImage.Target 
= "_blank";
                _ViewImage.Style[HtmlTextWriterStyle.BorderWidth] 
= "0px";
                _ViewImage.Style[HtmlTextWriterStyle.Display] 
= "block";
                _ViewImage.Style[HtmlTextWriterStyle.Overflow] 
= "hidden";
            }
            
else
            {
                _ViewImage.InnerText 
= _Text;
            }
            _ViewImage.Attributes[
"title"= Text;
            
return _ViewImage;
        }
    }
    
private HtmlAnchor _ThumbImage;
    
internal HtmlAnchor ThumbImage
    {
        
get
        {
            
if (_ThumbImage == null) _ThumbImage = new HtmlAnchor();
            
if (_ThumbImageUrl != String.Empty)
            {
                HtmlImage hi 
= new HtmlImage();
                hi.Src 
= _ThumbImageUrl;
                hi.Style[HtmlTextWriterStyle.BorderWidth] 
= "0px";
                _ThumbImage.Controls.Add(hi);
            }
            
else
            {
                _ThumbImage.InnerText 
= LimitText;
            }
            _ThumbImage.Style.Value 
= Style.Value;
            _ThumbImage.Style[HtmlTextWriterStyle.Display] 
= "block";
            _ThumbImage.HRef 
= HRef;
            _ThumbImage.Target 
= "_blank";
            _ThumbImage.Attributes[
"title"= Text;
            
return _ThumbImage;
        }
    }
    
protected override void Render(HtmlTextWriter writer)
    {
        
if ((int)ThumbWidth.Value > 0)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Href, _HRef);
            writer.AddAttribute(HtmlTextWriterAttribute.Title, _Text);
            
//writer.AddAttribute(HtmlTextWriterAttribute.Style, String.Format("display:block;width:{0};height:{1}", _ThumbWidth, _ViewHeight));
            writer.RenderBeginTag(HtmlTextWriterTag.A);
            writer.AddAttribute(HtmlTextWriterAttribute.Src, _ThumbImageUrl);
            writer.RenderBeginTag(HtmlTextWriterTag.Img);
            writer.RenderEndTag();
            writer.RenderEndTag();
        }
    }
}

下面是一个稍微复杂的问题,就是以集合的方式在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部分的内容。

转载于:https://www.cnblogs.com/muse/articles/1441193.html

你可能感兴趣的文章
Flatten Binary Tree to Linked List
查看>>
Edit Distance
查看>>
软件工程第一次作业补充
查看>>
N76E003---输入捕获
查看>>
poj 1094 Sorting It All Out(拓扑排序)
查看>>
acdream B - 郭式树 (水题 卡cin,cout, 卡LL)
查看>>
BMP图像格式
查看>>
python的匿名函数lambda解释及用法
查看>>
c#遍历Dictionary使用KeyValuePair
查看>>
defineProperties属性的运用==数据绑定
查看>>
关于 IOS 发布的点点滴滴记录(一)
查看>>
《EMCAScript6入门》读书笔记——14.Promise对象
查看>>
CSS——水平/垂直居中
查看>>
Eclipse连接mysql数据库jdbc下载(图文)
查看>>
Python中Selenium的使用方法
查看>>
三月23日测试Fiddler
查看>>
20171013_数据库新环境后期操作
查看>>
poj 1654 && poj 1675
查看>>
运维派 企业面试题1 监控MySQL主从同步是否异常
查看>>
Docker 版本
查看>>