zoukankan      html  css  js  c++  java
  • silverlight 模仿淘宝预览图片

    1.先贴个效果图,看看哦。

    2. 分为两个silverlight,左侧是小图(HoverImageSmall.xap),右侧为大图(HoverImageLarge.xap),web项目承载两个silverlight,并负责两个sl之间的通讯。

    3.小图(HoverImageSmall.xap)部分,源码如下

    代码
    //这个声明要加的,否则JS调用不到
    [ScriptableType]
    public partial class MainPage : UserControl
    {
    //遮罩块的宽、高
    double thumbWidth, thumbHeight;
    //是否需要局部放大显示
    bool IsHoverView = true;

    //这个构造可以从html传参数进来
    public MainPage(IDictionary<string, string> InitParams)
    {
    InitializeComponent();

    //从html接收的参数 这样子获取
    var parm1 = InitParams["parm1"].ToString();

    canMove.MouseMove
    += new MouseEventHandler(ImgThumb_MouseMove);
    canMove.MouseEnter
    += new MouseEventHandler(ImgThumb_MouseEnter);
    canMove.MouseLeave
    += new MouseEventHandler(ImgThumb_MouseLeave);

    ImgOriginal.ImageOpened
    += new System.EventHandler<RoutedEventArgs>(ImgOriginal_ImageOpened);
    ImgThumb.ImageOpened
    += new System.EventHandler<RoutedEventArgs>(ImgThumb_ImageOpened);

    //注册js调用的宿主名称
    HtmlPage.RegisterScriptableObject("HoverImageSmall", this);
    }

    #region image event
    //小图载入后,计算遮罩块的尺寸,最小20*20
    void ImgThumb_ImageOpened(object sender, RoutedEventArgs e)
    {
    thumbWidth
    = ImgThumb.ActualWidth;
    thumbHeight
    = ImgThumb.ActualHeight;

    recMove.Width
    = 400 / (ImgOriginal.ActualWidth / ImgThumb.ActualWidth);
    if (recMove.Width > ImgThumb.ActualWidth)
    recMove.Width
    = ImgThumb.ActualWidth;

    recMove.Height
    = 400 / (ImgOriginal.ActualHeight / ImgThumb.ActualHeight);
    if (recMove.Height > ImgThumb.ActualHeight)
    recMove.Height
    = ImgThumb.ActualHeight;

    if (recMove.Width < 20)
    recMove.Width
    = 20;

    if (recMove.Height < 20)
    recMove.Height
    = 20;
    }

    //判断当前图是否小于大图尺寸,如果小于,不需要此功能
    void ImgOriginal_ImageOpened(object sender, RoutedEventArgs e)
    {
    if (ImgOriginal.ActualWidth < 400 && ImgOriginal.ActualHeight < 400)
    {
    recMove.Visibility
    = System.Windows.Visibility.Collapsed;
    IsHoverView
    = false;
    }
    }

    //鼠标离开小图
    void ImgThumb_MouseLeave(object sender, MouseEventArgs e)
    {
    this.Cursor = Cursors.Arrow;
    hoverPosition
    = "Visibility:0";
    if (HoverChanged != null)
    HoverChanged(
    this, null);
    }

    //鼠标进入小图区域
    void ImgThumb_MouseEnter(object sender, MouseEventArgs e)
    {
    this.Cursor = Cursors.Hand;
    hoverPosition
    = "Visibility:1";
    if (HoverChanged != null)
    HoverChanged(
    this, null);
    }

    //查看指定区域
    void ImgThumb_MouseMove(object sender, MouseEventArgs e)
    {
    if (!IsHoverView)
    {
    hoverPosition
    = "NoHover:";
    if (HoverChanged != null)
    HoverChanged(
    this, null);
    return;
    }
    Point p
    = e.GetPosition(ImgThumb);
    double moveLeft = p.X - recMove.Width / 2;
    double moveTop = p.Y - recMove.Height / 2;
    if (moveLeft < 0) moveLeft = 0;
    if (moveTop < 0) moveTop = 0;

    if (moveLeft > thumbWidth - recMove.Width)
    moveLeft
    = thumbWidth - recMove.Width;
    if (moveTop > thumbHeight - recMove.Height) moveTop = thumbHeight - recMove.Height;

    Canvas.SetLeft(recMove, moveLeft);
    Canvas.SetTop(recMove, moveTop);

    double newLeft = moveLeft * ImgOriginal.ActualWidth / thumbWidth;
    double newTop = moveTop * ImgOriginal.ActualHeight / thumbHeight;

    hoverPosition
    = "Position:" + newLeft + "," + newTop;
    if (HoverChanged != null)
    HoverChanged(
    this, null);
    }


    #endregion

    #region 更换图片
    private void button1_Click(object sender, RoutedEventArgs e)
    {
    OpenFileDialog ofg
    = new OpenFileDialog();
    ofg.Multiselect
    = false;
    ofg.Filter
    = "All files (*.*)|*.*|PNG Images (*.png)|*.png";

    if (ofg.ShowDialog() == true)
    AddFile(ofg.File.OpenRead(), ofg.File.Name);
    }

    void AddFile(FileStream fs, string fileName)
    {
    byte[] bytes = new byte[fs.Length];
    fs.Read(bytes,
    0, bytes.Length);

    imgBase64
    = Convert.ToBase64String(bytes);

    string imgFormat = "<img id=\"testImg\" style=\"500px; height:400px;\" src=\"data:image/png;base64,{0}\"; />";
    imgHtml
    = string.Format(imgFormat, imgBase64);

    BitmapImage bitImg
    = new BitmapImage();
    bitImg.SetSource(fs);

    ImgThumb.Source
    = bitImg;
    ImgOriginal.Source
    = bitImg;

    #region xx
    if (bitImg.PixelWidth < 400 && bitImg.PixelHeight < 400)
    {
    recMove.Visibility
    = System.Windows.Visibility.Collapsed;
    IsHoverView
    = false;
    }
    else
    {
    IsHoverView
    = true;
    recMove.Visibility
    = System.Windows.Visibility.Visible;
    }

    if (bitImg.PixelWidth <= 160 && bitImg.PixelHeight <= 160)
    {
    thumbWidth
    = bitImg.PixelWidth;
    thumbHeight
    = bitImg.PixelHeight;
    }
    else if (bitImg.PixelWidth < 160)
    {
    thumbHeight
    = 160;
    thumbWidth
    = 160 * bitImg.PixelWidth / bitImg.PixelHeight;
    }
    else if (bitImg.PixelHeight < 160)
    {
    thumbWidth
    = 160;
    thumbHeight
    = 160 * bitImg.PixelHeight / bitImg.PixelWidth;
    }
    else
    {
    if (bitImg.PixelWidth > bitImg.PixelHeight)
    {
    thumbWidth
    = 160;
    thumbHeight
    = 160 * bitImg.PixelHeight / bitImg.PixelWidth;
    }
    else
    {
    thumbHeight
    = 160;
    thumbWidth
    = 160 * bitImg.PixelWidth / bitImg.PixelHeight;
    }
    }

    recMove.Width
    = 400 / (bitImg.PixelWidth / thumbWidth);
    if (recMove.Width > thumbWidth)
    recMove.Width
    = thumbWidth;

    recMove.Height
    = 400 / (bitImg.PixelHeight / thumbHeight);
    if (recMove.Height > thumbHeight)
    recMove.Height
    = thumbHeight;

    if (recMove.Width < 20)
    recMove.Width
    = 20;

    if (recMove.Height < 20)
    recMove.Height
    = 20;
    #endregion

    if (FileSelected != null)
    FileSelected(
    this, null);
    }
    #endregion

    #region ScriptableMemberAttribute
    [ScriptableMemberAttribute]
    public string imgBase64 { get; set; }

    [ScriptableMemberAttribute]
    public string imgHtml { get; set; }

    [ScriptableMemberAttribute]
    public string hoverPosition { get; set; }

    [ScriptableMemberAttribute]
    public string imgViewVisible { get; set; }
    #endregion

    #region ScriptableEvent
    [ScriptableMember()]
    public event EventHandler FileSelected;

    [ScriptableMember()]
    public event EventHandler MoveOnImage;

    [ScriptableMember()]
    public event EventHandler ViewVisibilityChanged;

    [ScriptableMember()]
    public event EventHandler HoverChanged;
    #endregion

    #region Scriptable members to control functions via javascript

    [ScriptableMember]
    public void EnableDrop()
    {
    //button1 image1.AllowDrop = true;
    }

    [ScriptableMember()]
    public event EventHandler MaximumFileSizeReached;

    #endregion
    }

    4. 大图 (HoverImageLarge.xap),这个部分比较简单。

    代码
    public partial class MainPage : UserControl
    {
    double newLeft, newTop;

    public MainPage()
    {
    InitializeComponent();
    HtmlPage.RegisterScriptableObject(
    "HoverImageLarge", this);
    }

    void messageReceiver_MessageReceived(object sender, MessageReceivedEventArgs e)
    {
    string msg;
    if (e.Message.StartsWith("Position:"))
    {
    msg
    = e.Message.Replace("Position:", "");
    string[] arr = msg.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    newLeft
    = double.Parse(arr[0]);
    newTop
    = double.Parse(arr[1]);
    Canvas.SetLeft(img2,
    -newLeft);
    Canvas.SetTop(img2,
    -newTop);
    }

    if (e.Message.StartsWith("NoHover:"))
    {
    Canvas.SetLeft(img2,
    0);
    Canvas.SetTop(img2,
    0);
    }

    if (e.Message.StartsWith("Visibility:"))
    {
    msg
    = e.Message.Replace("Visibility:", "");
    if (Int32.Parse(msg) == 1)
    {
    img2.Visibility
    = System.Windows.Visibility.Visible;
    }
    else
    {
    img2.Visibility
    = System.Windows.Visibility.Collapsed;
    }
    }

    }

    #region script method
    [ScriptableMember()]
    public void SetImage(string imageBase64)
    {
    if (imageBase64 == null) return;
    MemoryStream pFileStream
    = new MemoryStream();
    byte[] imgByte = Convert.FromBase64String(imageBase64);
    pFileStream.Write(imgByte,
    0, imgByte.Length);
    BitmapImage bitmap
    = new BitmapImage();
    bitmap.SetSource(pFileStream);
    img2.Source
    = bitmap;
    }

    [ScriptableMember()]
    public void SetPosition(string msg)
    {
    if (msg == null) return;
    if (msg.StartsWith("Position:"))
    {
    msg
    = msg.Replace("Position:", "");
    string[] arr = msg.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    newLeft
    = double.Parse(arr[0]);
    newTop
    = double.Parse(arr[1]);
    Canvas.SetLeft(img2,
    -newLeft);
    Canvas.SetTop(img2,
    -newTop);
    }

    if (msg.StartsWith("NoHover:"))
    {
    Canvas.SetLeft(img2,
    0);
    Canvas.SetTop(img2,
    0);
    }

    if (msg.StartsWith("Visibility:"))
    {
    msg
    = msg.Replace("Visibility:", "");
    if (Int32.Parse(msg) == 1)
    {
    img2.Visibility
    = System.Windows.Visibility.Visible;
    }
    else
    {
    img2.Visibility
    = System.Windows.Visibility.Collapsed;
    }
    }
    }

    #endregion
    }

    5.由于最近比较忙,没空详细写,呵呵。源代码在这里,各位看官那自己下载分析吧。

    源码下载selectFile仿淘宝预览图片.rar

  • 相关阅读:
    DevExpress 学习使用之 ComboBoxEdit
    DevExpress 学习使用之 NavBarControl
    代码重构方向原则指导(转载 cnblogs)
    适合编写代码的字体 Source Code Pro
    Asycn/Await 异步编程初窥(二)
    Asycn/Await 异步编程初窥
    【数据结构】冒泡排序算法示例
    【数据结构】分治算法求解假硬币问题
    【数据结构】图结构操作示例
    【数据结构】建立和平衡AVL二叉树
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/1901209.html
Copyright © 2011-2022 走看看