Silverlight 2.0'da farenin hareket etmediğini anlamak.

0 dakikada yazıldı

5802 defa okundu

Düzenle

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.