在图像控制WPF加载时动画图片 [英] Animate Image when loaded in Image Control WPF

查看:138
本文介绍了在图像控制WPF加载时动画图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建影像的幻灯片播放。为此,我有充足的时间每套间隔后装入图像控制新形象。但每次我加载说到没有任何动画,我需要在出动画的过渡动画或褪色加载每个图像的新形象。我怎样才能实现动画,同时在图像控制变化的图像?以下是code:

XAML:

 <网格和GT;
<图像来源={结合CurrentImage}/>
< /网格和GT;

XAML.cs

 视图模型=新ScreenSaverViewModel();
this.DataContext =视图模型;

ViewModel.cs

  ///<总结>
         ///获取当前图像显示吸引屏幕上。更改这个属性
         ///导致发出信号PropertyChanged事件
         ///< /总结>
        公共字符串CurrentImage
        {
            得到
            {
                返回this.currentImage;
            }            保护套
            {
                this.currentImage =价值;
                this.OnPropertyChanged(CurrentImage);
            }
        }        ///<总结>
        ///获取所有图像的观察的集合。
        ///< /总结>
        公众的ObservableCollection<串GT;图片
        {
            得到
            {
                返回this.images;
            }
        }     公共ScreenSaverViewModel()
        {
            照片=新的ObservableCollection<串GT;();            this.LoadSlideShowImages();            如果(图片=空&放大器;!&放大器; Images.Count大于0)
            {
                this.CurrentImage = this.Images [this.currentIndex]                this.tickTimer =新DispatcherTimer();
                this.tickTimer.Interval = TimeSpan.FromMilliseconds(TimerIntervalMilliseconds);
                this.tickTimer.Tick + =(S,E)=>
                {
                    this.currentIndex ++;
                    this.currentIndex = this.currentIndex< this.Images.Count? this.currentIndex:0;
                    this.CurrentImage = this.Images [this.currentIndex]
                };                后映像加载//启动定时器
                this.tickTimer.Start();
            }
        }


解决方案

我已经创建了我所提出的财产变化的类继承Image控件时的图像控制的变化源。关于这一点我已经申请触发器现在这个工作正常。以下是code:

 <控制:ImageControl来源={结合CurrentImage}>
            <控制:ImageControl.Triggers>
                <的EventTrigger RoutedEvent =控制:ImageControl.SourceChanged>
                    < BeginStoryboard>
                        <情节提要>
                            &所述; DoubleAnimation是Storyboard.TargetProperty =(Image.Opacity)从=0要=1持续时间=0:0:1/>
                        < /故事板>
                    < / BeginStoryboard>
                < /&的EventTrigger GT;
            < /控制:ImageControl.Triggers>
        < /控制:ImageControl>
  公共类ImageControl:图片
    {
        公共静态只读RoutedEvent SourceChangedEvent = EventManager.RegisterRoutedEvent(
      SourceChanged,RoutingStrategy.Direct的typeof(RoutedEventHandler)的typeof(ImageControl));        静态ImageControl()
        {
            Image.SourceProperty.OverrideMetadata(typeof运算(ImageControl),新FrameworkPropertyMetadata(SourcePropertyChanged));
        }        公共事件RoutedEventHandler SourceChanged
        {
            添加{的AddHandler(SourceChangedEvent,值); }
            除去{RemoveHandler(SourceChangedEvent,值); }
        }        私有静态无效SourcePropertyChanged(OBJ的DependencyObject,DependencyPropertyChangedEventArgs E)
        {
            形象画像= OBJ为图像;
            如果(形象!= NULL)
            {
                image.RaiseEvent(新RoutedEventArgs(SourceChangedEvent));
            }
        }
    }

I want to create a slideshow of images. For this I have loaded new images in image control after every set interval of time. But each time i load a new image it comes without any animation I need to load each image with a transition animation or fade in-out animation. How can I achieve animation while changing images in Image control? Following is the code:

XAML:

<Grid>
<Image Source="{Binding CurrentImage}" />
</Grid>

XAML.cs

ViewModel = new ScreenSaverViewModel();
this.DataContext = ViewModel;

ViewModel.cs

         /// <summary>
         /// Gets the current image to display on the attract screen. Changes to this property 
         /// cause the PropertyChanged event to be signaled
         /// </summary>
        public string CurrentImage
        {
            get
            {
                return this.currentImage;
            }

            protected set
            {
                this.currentImage = value;
                this.OnPropertyChanged("CurrentImage");
            }
        }

        /// <summary>
        /// Gets the observable collection of all images.
        /// </summary>
        public ObservableCollection<string> Images
        {
            get
            {
                return this.images;
            }
        }

     public ScreenSaverViewModel()
        {
            images = new ObservableCollection<string>();

            this.LoadSlideShowImages();

            if (Images != null && Images.Count > 0)
            {
                this.CurrentImage = this.Images[this.currentIndex];

                this.tickTimer = new DispatcherTimer();
                this.tickTimer.Interval = TimeSpan.FromMilliseconds(TimerIntervalMilliseconds);
                this.tickTimer.Tick += (s, e) =>
                {
                    this.currentIndex++;
                    this.currentIndex = this.currentIndex < this.Images.Count ? this.currentIndex : 0;
                    this.CurrentImage = this.Images[this.currentIndex];
                };

                // start the timer after image is loaded
                this.tickTimer.Start();
            }
        }

解决方案

I have created a class inheriting Image control in which I have raised property change when Source of image control changes. on which I have applied trigger this works fine now. Following is the code:

<controls:ImageControl   Source="{Binding CurrentImage}" >
            <controls:ImageControl.Triggers>
                <EventTrigger RoutedEvent="controls:ImageControl.SourceChanged">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="(Image.Opacity)" From="0" To="1" Duration="0:0:1" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </controls:ImageControl.Triggers>
        </controls:ImageControl>


  public class ImageControl : Image
    {
        public static readonly RoutedEvent SourceChangedEvent = EventManager.RegisterRoutedEvent(
      "SourceChanged", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(ImageControl));

        static ImageControl()
        {
            Image.SourceProperty.OverrideMetadata(typeof(ImageControl), new FrameworkPropertyMetadata(SourcePropertyChanged));
        }

        public event RoutedEventHandler SourceChanged
        {
            add { AddHandler(SourceChangedEvent, value); }
            remove { RemoveHandler(SourceChangedEvent, value); }
        }

        private static void SourcePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            Image image = obj as Image;
            if (image != null)
            {
                image.RaiseEvent(new RoutedEventArgs(SourceChangedEvent));
            }
        }
    }

这篇关于在图像控制WPF加载时动画图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆