zoukankan      html  css  js  c++  java
  • Wpf实现图片自动轮播自定义控件


    近来,公司项目需要,需要写一个自定义控件,然后就有下面的控件产生。
    样式没有定义好,基本功能已经实现。
    1.创建为自定义控件的XAML页面

    可能要用到的wp源码:http://code.662p.com/list/14_1.html
    下面为后台代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Windows.Threading;
    
    namespace EZ.AppPlatform.App.VideoSummary.UserControl
    {
        /// <summary>
        /// AdvertPicControl.xaml 的交互逻辑
        /// </summary>
        public partial class AdvertPicControl : System.Windows.Controls.UserControl
        {
            #region 加载List数据
            /// <summary>
            /// 当前图片地址播放列表
            /// </summary>
            private static List<string> currentList;
    
            public static DependencyProperty advertPicList = DependencyProperty.Register("advertPicList", typeof(List<string>), typeof(AdvertPicControl)
                , new PropertyMetadata(new PropertyChangedCallback(loadAdvertPic)));
    
            public List<string> AdvertPicList
            {
                get { return (List<string>)GetValue(advertPicList); }
                set { SetValue(advertPicList, value); }
            }
    
            /// <summary>
            /// 图片播放器地址
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void loadAdvertPic(DependencyObject sender, DependencyPropertyChangedEventArgs e)
            {
                AdvertPicControl advertPicControl = (AdvertPicControl)sender;
                if (e.Property == advertPicList)
                {
                    advertPicControl.AdvertPicList = (List<string>)e.NewValue;
                    currentList = advertPicControl.AdvertPicList;
                }
            }
            #endregion
    
            #region 加载图片停留时间
            /// <summary>
            /// 当前图片地址播放列表
            /// </summary>
            private static List<int> currentTimeList;
    
            public static DependencyProperty advertPicStayTime = DependencyProperty.Register("advertPicStayTime", typeof(List<int>), typeof(AdvertPicControl)
                , new PropertyMetadata(new PropertyChangedCallback(loadAdvertStayTime)));
    
            public List<int> AdvertPicStayTime
            {
                get { return (List<int>)GetValue(advertPicStayTime); }
                set { SetValue(advertPicStayTime, value); }
            }
    
            /// <summary>
            /// 图片播放器图片停留时间
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void loadAdvertStayTime(DependencyObject sender, DependencyPropertyChangedEventArgs e)
            {
                AdvertPicControl advertPicControl = (AdvertPicControl)sender;
                if (e.Property == advertPicStayTime)
                {
                    advertPicControl.AdvertPicStayTime = (List<int>)e.NewValue;
                    currentTimeList = advertPicControl.AdvertPicStayTime;
                }
            }
            #endregion
    
            #region 注册自定义事件和参数
            public static readonly RoutedEvent AdvertPicPlayStateChangedEvent;
    
            public class AdvertPicPlayEventArgs : RoutedEventArgs
            {
                public int playState
                {
                    get;
                    set;
                }
    
                public int playLength
                {
                    get;
                    set;
                }
    
                public int playIndex
                {
                    get;
                    set;
                }
            }
    
            static AdvertPicControl()
            {
                AdvertPicPlayStateChangedEvent = EventManager.RegisterRoutedEvent("AdvertPicPlayStateChanged",
                    RoutingStrategy.Bubble, typeof(AdvertPicPlayStateChangedHandler), typeof(AdvertPicControl));
            }
            public delegate void AdvertPicPlayStateChangedHandler(object sender, AdvertPicPlayEventArgs e);
            public event AdvertPicPlayStateChangedHandler AdvertPicPlayStateChanged
            {
                add { AddHandler(AdvertPicControl.AdvertPicPlayStateChangedEvent, value); }
                remove { RemoveHandler(AdvertPicControl.AdvertPicPlayStateChangedEvent, value); }
            }
            #endregion
    
            #region 动态加载对应的切换图片按钮,单击响应加载对应的图片。
    
            #endregion
    
            public AdvertPicControl()
            {
                InitializeComponent();
            }
    
            DispatcherTimer switchPicTimer = new DispatcherTimer();
            int i = 0;
            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                //默认 1秒切换一张图片
               // switchPicTimer.IsEnabled = false;
            
                switchPicTimer.Tick += SwitchPicEvent;
                for (int j = 0; j < currentList.Count; j++)
                {
                   Button btn=new Button();
                    btn.Width = 20;
                    btn.Height = 20;
                    btn.Content = j+1;
                    btn.Tag = j;
                    btn.Click+=new RoutedEventHandler(btn_Click);
                    PicCountNum.Children.Add(btn);
                }
             
            }
    
            void btn_Click(object sender, RoutedEventArgs e)
            {
                Button btn = (Button) sender;
                BitmapImage bitmap = new BitmapImage(new Uri(currentList[Convert.ToInt32( btn.Tag)], UriKind.Absolute));
                imgAdvertPic.Stretch = Stretch.Fill;
                imgAdvertPic.Source = bitmap;
            }
    
            /// <summary>
            /// 开始播放
            /// </summary>
            /// <param name="interval">图片切换时间</param>
            public void Play(int interval)
            {
                int defaultinterval = 0;
                if (interval != 0)
                    defaultinterval = interval;
    
                switchPicTimer.IsEnabled = true;
                switchPicTimer.Interval = new TimeSpan(0, 0, defaultinterval);
                switchPicTimer.Start();
                i = 0;
            }
    
            /// <summary>
            /// 停止播放
            /// </summary>
            public void Stop()
            {
                switchPicTimer.IsEnabled = false;
                switchPicTimer.Stop();
            }
    
            /// <summary>
            /// 切换图片事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void SwitchPicEvent(object sender, EventArgs e)
            {
                if (null != currentList)
                {
                   // Console.WriteLine("开始切换~~~");
                    if (i <= currentList.Count-1)//修改实现循环播放。
                    {
                        DoHandlerStop(Image.OpacityProperty, 20, 0, 4, imgAdvertPic, SwitchPic);
                    }
                    else
                    {
                        //AdvertPicPlayEventArgs args = new AdvertPicPlayEventArgs();
                        //args.RoutedEvent = AdvertPicPlayStateChangedEvent;
                        //args.playState = 1;
                        //RaiseEvent(args);
                        // switchPicTimer.Stop();
                        // switchPicTimer.IsEnabled = false;
                        i = 0;
                        DoHandlerStop(Image.OpacityProperty, 20, 0, 4, imgAdvertPic, SwitchPic);
                     
                    }
                    if (null != currentTimeList)
                    {
                        Thread.Sleep(currentTimeList[i]); //图片停留时间
                    }
                }
            }
    
            /// <summary>
            /// 动画播放完毕切换图片
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void SwitchPic(object sender, EventArgs e)
            {
                BitmapImage bitmap = new BitmapImage(new Uri(currentList[i], UriKind.Absolute));
                imgAdvertPic.Stretch = Stretch.Fill;
                imgAdvertPic.Source = bitmap;
                if (i < currentList.Count)
                {
                    i++;
                }
              
            }
    
            public void ClickToPic(int id)
            {
              
            }
    
    
            /// <summary>
            /// 动画
            /// </summary>
            /// <param name="dp"></param>
            /// <param name="from"></param>
            /// <param name="to"></param>
            /// <param name="duration"></param>
            /// <param name="element"></param>
            /// <param name="complateHander"></param>
            public void DoHandlerStop(DependencyProperty dp, double from, double to, double duration, UIElement element, EventHandler complateHander)
            {
                DoubleAnimation doubleAnimation = new DoubleAnimation();//创建双精度动画对象
                doubleAnimation.From = from;
                doubleAnimation.To = to;//设置动画的结束值
                doubleAnimation.Duration = TimeSpan.FromSeconds(duration);//设置动画时间线长度
                doubleAnimation.FillBehavior = FillBehavior.Stop;//设置动画完成后执行的操作 
                doubleAnimation.Completed += complateHander;
                element.BeginAnimation(dp, doubleAnimation);//设置动画应用的属性并启动动画
            }
        }
    }
    

      详细说明:http://wp.662p.com/thread-8108-1-1.html

  • 相关阅读:
    呼叫中心架构设计
    呼叫中心架构设计
    python数据分析工具安装集合
    QQ 聊天机器人小薇 2.0.0 发布!
    QQ 聊天机器人小薇 2.0.0 发布!
    spark编程python实例
    Intellij idea配置scala开发环境
    stm32时钟设置函数
    ESP8266 TCP传输AT指令顺序
    WIFI接入Internet配置过程
  • 原文地址:https://www.cnblogs.com/baidulianweikjj/p/4117966.html
Copyright © 2011-2022 走看看