栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

WPF实现手风琴式轮播图切换效果

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

WPF实现手风琴式轮播图切换效果

本文实例为大家分享了WPF实现轮播图切换效果的具体代码,供大家参考,具体内容如下

实现效果如下:

步骤:

1、自定义控件MyImageControl

实现图片的裁切和动画的赋值。

public partial class MyImageControl : UserControl
  {
    public static readonly DependencyProperty ShowImageProperty = DependencyProperty.Register("ShowImage", typeof(BitmapImage), typeof(MyImageControl), new Propertymetadata(null));
    public BitmapImage ShowImage
    {
      get { return (BitmapImage)GetValue(ShowImageProperty); }
      set { SetValue(ShowImageProperty, value); }
    }
 
    public MyImageControl()
    {
      InitializeComponent();
    }
 
    public Storyboard storyboard = new Storyboard();
    private const int FlipCount = 5;
    BitmapSource[] bitmap = new BitmapSource[FlipCount];
    Image[] images = new Image[FlipCount];
 
    public void GetHorizontalFlip()
    {
      int partImgWidth = (int)this.ShowImage.PixelWidth;
      int partImgHeight = (int)(this.ShowImage.PixelHeight / FlipCount);
      for (int i = 0; i < FlipCount; i++)
      {
 bitmap[i] = GetPartImage(this.ShowImage, 0, i * partImgHeight, partImgWidth, partImgHeight);
 
 images[i] = new Image()
 {
   Width = partImgWidth,
   Height = partImgHeight,
   Source = bitmap[i],  
 };
 
 Canvas.SetTop(images[i], i * partImgHeight);
 this.mainCanvas.Children.Add(images[i]);
 
 DoubleAnimation da = new DoubleAnimation(0, (int)this.ShowImage.PixelWidth, new Duration(TimeSpan.FromMilliseconds((i + 1) * 250)), FillBehavior.HoldEnd);
 storyboard.Children.Add(da);
 Storyboard.SetTarget(da, images[i]);
 Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Left)"));
      }
 
      storyboard.FillBehavior = FillBehavior.HoldEnd;
      storyboard.Completed += new EventHandler(Storyboard_Completed);
    }
 
    private void Storyboard_Completed(object sender, EventArgs e)
    {
      this.mainCanvas.Children.Clear();
      storyboard.Children.Clear();
    }
 
    private BitmapSource GetPartImage(BitmapImage img, int XCoordinate, int YCoordinate, int Width, int Height)
    {
      return new CroppedBitmap(img, new Int32Rect(XCoordinate, YCoordinate, Width, Height));
    }
  }

2、自定义轮播控件

实现图片点击轮播和动画的启动。

public partial class MyRollControl : UserControl
  {
    public MyRollControl()
    {
      InitializeComponent();
    }
 
    /// 
    /// 是否开始滚动
    /// 
    public bool isBegin = false;
 
    /// 
    /// 本轮剩余滚动数
    /// 
    public int rollNum = 0;
 
    private List _ls_images;
    /// 
    /// 滚动图片组
    /// 
    public List ls_images
    {
      set
      {
 if (rollNum > 0)
 {
   // 本轮滚动未结束
 }
 else
 {
   // 开始新的一轮滚动
   _ls_images = value;
   rollNum = _ls_images.Count();
 }
      }
      get { return _ls_images; }
    }
 
    private int n_index = 0;// 滚动索引
 
    /// 
    /// 启动
    /// 
    public void Begin()
    {
      if (!isBegin)
      {
 isBegin = true;
 
 this.ResetStory();
 this.controlFront.GetHorizontalFlip();
      }
    }
 
    /// 
    /// 初始化图片
    /// 
    void ResetStory()
    {
      if (this.ls_images.Count > 0)
      {
 this.controlFront.ShowImage = this.ls_images[this.n_index++ % this.ls_images.Count];
 this.controlBack.ShowImage = this.ls_images[this.n_index % this.ls_images.Count];
      }
    }
 
    private void mainGrid_MouseDown(object sender, MouseButtonEventArgs e)
    {
      if (this.controlFront.storyboard.Children.Count > 0)
      {
 if(this.controlBack.storyboard.Children.Count <= 0)
 {
   Canvas.SetZIndex(this.controlFront, 0);
   this.controlFront.storyboard.Begin();
   this.controlBack.GetHorizontalFlip();
   rollNum--;
   this.ResetStory();
 }
      }
      else if(this.controlFront.storyboard.Children.Count <= 0)
      {
 if(this.controlBack.storyboard.Children.Count > 0)
 {
   this.controlBack.storyboard.Begin();
   
   rollNum--;
   this.ResetStory();
   Canvas.SetZIndex(this.controlFront, -1);
   this.controlFront.GetHorizontalFlip();
 }
      }
    }
  }

3、主窗体调用后台逻辑

public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
 
      List ls_adv_img = new List();
      List listAdv = GetUserImages(@"C:Image");
      foreach (string a in listAdv)
      {
 BitmapImage img = new BitmapImage(new Uri(a));
 ls_adv_img.Add(img);
      }
      this.rollImg.ls_images = ls_adv_img;
      this.rollImg.Begin();
    }
 
    /// 
    /// 获取当前用户的图片文件夹中的图片路径列表(不包含子文件夹)
    /// 
    private List GetUserImages(string path)
    {
      List images = new List();
      DirectoryInfo dir = new DirectoryInfo(path);
      FileInfo[] files = GetPicFiles(path, "*.jpg,*.png,*.bmp,", SearchOption.TopDirectoryOnly);
 
      if (files != null)
      {
 foreach (FileInfo file in files)
 {
   images.Add(file.FullName);
 }
      }
      return images;
    }
 
    private FileInfo[] GetPicFiles(string picPath, string searchPattern, SearchOption searchOption)
    {
      List ltList = new List();
      DirectoryInfo dir = new DirectoryInfo(picPath);
      string[] sPattern = searchPattern.Replace(';', ',').Split(',');
      for (int i = 0; i < sPattern.Length; i++)
      {
 FileInfo[] files = null;
 try
 {
   files = dir.GetFiles(sPattern[i], searchOption);
 }
 catch (System.Exception ex)
 {
   files = new FileInfo[] { };
 }
 
 ltList.AddRange(files);
      }
      return ltList.ToArray();
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/121806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号