Makale Özeti

Bu yazımızda DispatcherTimer kullanımını örnekleyerek bir Silverlight 2.0 uygulamasında kullanıcının fareyi belirlediğimiz sürelerde hareketsiz bıraktığını nasıl algılayabileceğimize göz atarak ufak bir uygulana için ekran koruyucusu yapıyoruz.

Makale

Bu yazımızda Silverlight 2.0 RC0 ile Silverlight uygulaması içerisinde minik bir ekran koruyucusu yapacağız. Aslında amacımız ekran korumak değil tabi ki, istediğimiz şey kullanıcı Silverlight uygulamasını kullanmadığında farklı bir içerik göstermek. Bu belki bir reklam, belki farklı bir "Ekrana Geri Dön Kullanıcı" sesli mesajı veya çok daha farklı bir uyarı sistemi olabilir. Özellikle veritabanı üzerinden veri alarak bu veriyi düzenleyen bir Silverlight uygulamasını düşünürsek belki de kullanıcı uzun süre ekran başında değilse verileri sunucuya göndererek kaydetmek için doğru zamanı yakalamışız demektir. Bu sistemin kullanılabileceği diğer örnekleri sizin hayal gücünüze bırakıyorum.

Animasyonlarımızı hazırlayalım

Örneğimizde görsel olarak herhangi bir ek öğe yer almayacak. Kullanıcı fareyi hareket ettirmezse bir süre sonra uygulamanın ana Grid'inin rengini siyaha çevireceğiz. Kullanıcı fare ile herhangi bir hareket yaptığı anda ise tekrar söz konusu Grid'i beyaza çevireceğiz. Siz örneklerinizde çok daha farklı işlemler yapabilirsiniz. Şimdi gelin bu iki animasyonla beraber oluşan XAML kodumuza göz atalım.

<UserControl x:Class="SilverlightApplication2.Page"

            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

            Width="400"

            Height="300">

  <UserControl.Resources>

    <Storyboard x:Name="Gitti">

      <ColorAnimationUsingKeyFrames BeginTime="00:00:00"

                                    Storyboard.TargetName="LayoutRoot"

                                    Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">

        <SplineColorKeyFrame KeyTime="00:00:01"

                            Value="#FF000000"/>

      </ColorAnimationUsingKeyFrames>

    </Storyboard>

    <Storyboard x:Name="Geldi">

      <ColorAnimationUsingKeyFrames BeginTime="00:00:00"

                                    Storyboard.TargetName="LayoutRoot"

                                    Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">

        <SplineColorKeyFrame KeyTime="00:00:01"

                            Value="#FFFFFFFF"/>

      </ColorAnimationUsingKeyFrames>

    </Storyboard>

  </UserControl.Resources>

  <Grid x:Name="LayoutRoot"

        Background="White">

 

  </Grid>

</UserControl>

Gördüğünüz gibi kodumuzda yer alan iki animasyon da LayoutRoot adındaki Grid'in rengini bir saniyede değiştirmeyi hedefliyor. Animasyonlardan Geldi adındaki Storyboard Grid'in rengini beyaza alırken, Gitti adındaki ise Siyah'a götürüyor. Kullanıcı fareyi hareket ettirmediğinde yani ekran başından gittiğinde Gitti, geri geldiğinde ise Geldi animasyonunu oynatacağız.

DispatcherTimer yetiş imdadımıza!

Farenin kullanıcı tarafından hareket ettirilip ettirilmediği sürekli kontrol etmek yerine aslında bizim ana bir Timer'a ihtiyacımız var. Varsayalım ki beş saniye boyunca herhangi bir hareket olmamışsa ekranı karartacağız. Bu durumda farenin oynatıldığı son harekette bu beş saniyelik sayacı başlatmamız gerek. Biz hangi fare hareketinin son hareket olduğunu anlayamayacağımız için aslında farenin her hareketinde sayacımızı başlatmalıyız fakat sonrasında eğer fare tekrar hareket ettirilirse sayacı durdurup baştan başlatmamız gerek.

İlk olarak Timer olarak kullanacağımız DispathcerTimer'ı global olarak tanımlayalım.

[VB]

WithEvents Kontrol As New System.Windows.Threading.DispatcherTimer

[C#]

System.Windows.Threading.DispatcherTimer Kontrol = new System.Windows.Threading.DispatcherTimer();

Uygulama ilk olarak istemciye yüklendiğinde hemen elimizdeki Timer'ın Interval yani tekrar aralığını düzenleyerek Timer'ı başlatmamız gerekiyor.

[VB]

    Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Kontrol.Interval = New TimeSpan(0, 0, 5)

        Kontrol.Start()

    End Sub

[C#]

        void Page_Loaded(object sender, RoutedEventArgs e)

        {

            Kontrol.Interval = new TimeSpan(0, 0, 5);

            Kontrol.Start();

        }

Eğer fare hareket etmezse yukarıdaki Timer sonuna kadar çalışacak ve doğal olarak Timer'ın Tick event'ı çalıştırılacaktır. Fakat bu süreçte eğer fare oynatılırsa bizim bu Timer'ı durdurup baştan başlatmamız gerek ki sayacımızı da bir anlamda sıfırlamış olalım. Uygulamamızın MouseMove durumunu yakalamamız yeterli olacaktır.

[VB]

    Private Sub Page_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseMove

        Kontrol.Stop()

        Kontrol.Start()

    End Sub

[C#]

        void Page_MouseMove(object sender, MouseEventArgs e)

        {

            Kontrol.Stop();

            Kontrol.Start();

        }

Sıra geldi Timer'ın Tick eventına gerekli kodu yazmaya. Aslında bu noktada yazacağımız tek kod bizim Gitti animasyonunu çalıştıracak olan kod olacak. Böylece uygulama kullanıcının fareyi beş saniyedir oynatmadığını algılamış ve gerekli işlemi yapmış olacak.

[VB]

    Private Sub Kontrol_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Kontrol.Tick

        Gitti.Begin()

        Gitmis = True

    End Sub

[C#]

        void Kontrol_Tick(object sender, EventArgs e)

        {

            Gitti.Begin();

            Gitmis = true;

        }

Kod içerisinde ilginizi çeken nokta eminim ki Gitmis değişkenidir. Gitmis değişkeni uygulamamızda global olarak tanımlayacağımız bir Boolean değişkeni. Bu değişkeni ScreenSaver yapımızın çalışıp çalışmadığını kontrol etmek için kullanacağız. Böylece MouseMove durumunda daha önce eğer ekran karartılmış ise ekranı aydınlatabileceğiz. Gelin MouseMove durumundaki yeni kodumuzu da inceleyelim.

[VB]

    Private Sub Page_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseMove

        Kontrol.Stop()

        Kontrol.Start()

        If Gitmis Then

            Gitmis = False

            Geldi.Begin()

        End If

    End Sub

[C#]

        void Page_MouseMove(object sender, MouseEventArgs e)

        {

            Kontrol.Stop();

            Kontrol.Start();

            if (Gitmis)

            {

                Gitmis = false;

                Geldi.Begin();

            }

        }

Gördüğünüz gibi fare her oynatıldığında sayacımızı sıfırlarken daha önce ekran karartılmış mı kontrol ediyoruz. Eğer karartılmış ise hemen aydınlatma işlemini başlatıyoruz ve tabi ki Gitmis değişkenimizi de False olarak ayarlıyoruz.

Uygulamamızın tam kodu aşağıdaki şekilde sonlanıyor;

[VB]

Partial Public Class Page

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

    End Sub

 

    WithEvents Kontrol As New System.Windows.Threading.DispatcherTimer

    Dim Gitmis As Boolean = False

 

    Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        Kontrol.Interval = New TimeSpan(0, 0, 5)

        Kontrol.Start()

    End Sub

 

    Private Sub Page_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseMove

        Kontrol.Stop()

        Kontrol.Start()

        If Gitmis Then

            Gitmis = False

            Geldi.Begin()

        End If

    End Sub

 

    Private Sub Kontrol_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Kontrol.Tick

        Gitti.Begin()

        Gitmis = True

    End Sub

End Class

[C#]

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

 

namespace SilverlightApplication3

{

    public partial class Page : UserControl

    {

        System.Windows.Threading.DispatcherTimer Kontrol = new System.Windows.Threading.DispatcherTimer();

        bool Gitmis;

 

        public Page()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(Page_Loaded);

            this.MouseMove += new MouseEventHandler(Page_MouseMove);

            this.Kontrol.Tick += new EventHandler(Kontrol_Tick);

        }

 

        void Kontrol_Tick(object sender, EventArgs e)

        {

            Gitti.Begin();

            Gitmis = true;

        }

 

        void Page_MouseMove(object sender, MouseEventArgs e)

        {

            Kontrol.Stop();

            Kontrol.Start();

            if (Gitmis)

            {

                Gitmis = false;

                Geldi.Begin();

            }

        }

 

        void Page_Loaded(object sender, RoutedEventArgs e)

        {

            Kontrol.Interval = new TimeSpan(0, 0, 5);

            Kontrol.Start();

        }

 

    }

}

Hepinize kolay gelsin.