In my previous article I explained DispatchTimer in Windows Store Apps. Now, here I will just use the DispatchTimer to execute a particular block continuously until it stops.
You can see my previous article from here:
How to use Timer in Windows Store Application Using XAML.
I create a Windows Store Application in which I will show you an example of image rotation or you can say a slide show of images using the DispatchTimer Class in XAML.
So, let's begin to create an application.
Procedure
Choose Blank Template of Windows Store using XAML.
Here I design UI using XAML code.
<Page
x:Class="TimerInWindowsStoreApps.ImageSlideShow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TimerInWindowsStoreApps"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid x:Name="LayoutRoot" Background="LightBlue">
<Grid Margin="0,50">
<Grid.RowDefinitions>
<RowDefinition Height="410"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<Border BorderBrush="Black" Grid.Row="0" BorderThickness="1" Width="700">
<Image x:Name="ImageSource" AutomationProperties.Name="ImageSource" VerticalAlignment="Top" Stretch="Fill" Height="380" Width="700">
</Image>
</Border>
</StackPanel>
<Grid x:Name="Input" Grid.Row="1" Margin="0,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal">
<Button x:Name="playSlideshow" Grid.Row="1" Margin="0,0,10,0" Click="playSlideshow_Click" Style="{StaticResource PlayAppBarButtonStyle}"/>
<Button x:Name="pauseSlideshow" Grid.Row="1" Margin="0,0,10,0" Click="pauseSlideshow_Click" Style="{StaticResource PauseAppBarButtonStyle}"/>
<Button x:Name="previousItem" Grid.Row="1" Margin="0,0,10,0" Click="previousItem_Click" Style="{StaticResource PreviousAppBarButtonStyle}"/>
<Button x:Name="nextItem" Grid.Row="1" Margin="0,0,10,0" Click="nextItem_Click" Style="{StaticResource NextAppBarButtonStyle}"/>
</StackPanel>
</Grid>
</Grid>
</Grid>
</Page>
In the above code I used an image control and 4 buttons for play, pause, next and previous slides of images.
Now, Let's put our .cs code in MainPage.xaml.cs file.
Here I just create a list of images and set the property and Tick event of the DispatchTimer.
DispatcherTimer playlistTimer = null;
List<string> Images = new List<string>();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Images.Add("Chrysanthemum.jpg");
Images.Add("Desert.jpg");
Images.Add("Hydrangeas.jpg");
Images.Add("Jellyfish.jpg");
Images.Add("Koala.jpg");
playlistTimer = new DispatcherTimer();
playlistTimer.Interval = new TimeSpan(0, 0, 5);
playlistTimer.Tick += playlistTimer_Tick;
ImageSource.Source = new BitmapImage(new Uri("ms-appx:///Assets/" + Images[count]));
}
Increment the counter of list to fetch next image.
void playlistTimer_Tick(object sender, object e)
{
if (Images != null)
{
if (count == Images.Count - 1)
count = 0;
if (count < Images.Count)
{
count++;
ImageRotation();
}
}
}
Now, set the source of the image on the basis of a counter of the list in the ImageRotation Method.
private void ImageRotation()
{
ImageSource.Source = new BitmapImage(new Uri("ms-appx:///Assets/" + Images[count].ToString()));
}
Complete Code of .cs file:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using Windows.UI.Xaml.Navigation;
namespace TimerInWindowsStoreApps
{
public sealed partial class ImageSlideShow : Page
{
public ImageSlideShow()
{
this.InitializeComponent();
}
DispatcherTimer playlistTimer = null;
List<string> Images = new List<string>();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Images.Add("Chrysanthemum.jpg");
Images.Add("Desert.jpg");
Images.Add("Hydrangeas.jpg");
Images.Add("Jellyfish.jpg");
Images.Add("Koala.jpg");
playlistTimer = new DispatcherTimer();
playlistTimer.Interval = new TimeSpan(0, 0, 5);
playlistTimer.Tick += playlistTimer_Tick;
ImageSource.Source = new BitmapImage(new Uri("ms-appx:///Assets/" + Images[count]));
}
int count = 0;
void playlistTimer_Tick(object sender, object e)
{
if (Images != null)
{
if (count == Images.Count - 1)
count = 0;
if (count < Images.Count)
{
count++;
ImageRotation();
}
}
}
private void ImageRotation()
{
ImageSource.Source = new BitmapImage(new Uri("ms-appx:///Assets/" + Images[count].ToString()));
}
private void playSlideshow_Click(object sender, RoutedEventArgs e)
{
if (Images != null)
{
playlistTimer.Start();
}
}
private void pauseSlideshow_Click(object sender, RoutedEventArgs e)
{
if (Images != null)
{
playlistTimer.Stop();
}
private void previousItem_Click(object sender, RoutedEventArgs e)
{
if (Images != null)
{
count--;
if (count >= 0)
{
ImageRotation();
}
else
{
count = Images.Count - 1;
ImageRotation();
}
}
}
private void nextItem_Click(object sender, RoutedEventArgs e)
{
if (Images != null)
{
count++;
if (count < Images.Count)
{
ImageRotation();
}
else
{
count = 0;
ImageRotation();
}
}
}
}
}
Now, build the application and run it. Click on the Play button to start the SlideShow.
You will see that after every 5 seconds the image will change. You can also pause the SlideShow.