Silverlight uygulamalarında MouseScroll (Roller) kullanımı.

0 dakikada yazıldı

5858 defa okundu

Düzenle

Silverlight uygulamalarında kullanıcı ile Silverlight nesneleri arasında
bir iletişim sağlayabilmek için fare tıklamalarını kullanmak gerçekten
çok kolay. Bu deneyimi bir üst adıma yükselterek sitemizin
ziyaretçilerine Silverlight uygulamalarında fareleriniz roller'larını
kullanma şansı da tanıyabiliriz. Aslında kullanacağımız teknik
Silverlight 1.0'ın yapısı gereği istemci tarafında JavaScript ile söz
konusu durumları yakalayarak bunu Silverlight nesnelerine yansıtmak
olacak.

İlk olarak gelin Expression Blend 2 ile yeni bir Silverlight projesi
yaratalım ve tasarım kısmına bir Image nesnesi yerleştirelim.
Hedefimiz site ziyaretçisinin faresinin roller'ı ile bu resmi büyütüp
küçültebilmesi, bir anlamda Zoom yapabilmesi. Hazılardığımız XAML kodu
aşağıdaki şekilde olmalı.

<Canvas

  xmlns="http://schemas.microsoft.com/client/2007"

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

  Width="640"
Height
="480"

  Background="White"

  x:Name="Page"

  >

  <Image
Width
="352" Height="229"
Canvas.Left
="8" Canvas.Top="8"

        Source="Autumn Leaves.jpg" RenderTransformOrigin="0,0">

    <Image.RenderTransform>

      <TransformGroup>

        <ScaleTransform
x
:Name="Boyutlandir"
ScaleX
="1" ScaleY="1"/>

        <SkewTransform
AngleX
="0" AngleY="0"/>

        <RotateTransform
Angle
="0"/>

        <TranslateTransform X="0" Y="0"/>

      </TransformGroup>

    </Image.RenderTransform>

  </Image>

</Canvas>

Yukarıdaki XAML kodu içerisinde özellikle dikkat etmemiz gereken nokta
Image içerisindeki ScaleTransform tagının programatik olarak
ulaşılabilir bir adının olmasının şart olması. Biz örneğimizde söz
konusu taga Boyutlandir adını verdik. Böylece bu nesneye ulaşarak
ScaleX ve ScaleY değerlerini programatik olarak değiştirerek
resme zoom yapılmış gibi bir ortamsağlayabileceğiz.

Bundan sonra tüm yapacaklarımızı projemizin Page.xaml.js dosyası
içerisinde yapacağız. İlk olarak bizim için otomatik olarak tanımlanmış
olan handleLoad fonksiyonu içerisine sayfa ilk açıldığında ve
Silverlight animasyonu yaratıldığında çalıştırılmak üzere aşağıdaki
kodları yazıyoruz.

    if (window.addEventListener)

        window.addEventListener('DOMMouseScroll', ScrollOldu, false);

        document.onmousewheel = ScrollOldu;

        window.onmousewheel = document.onmousewheel;

Yukarıdaki kodlarda aslında aynı işlemi birden çok farklı yöntem ile
birçok kes yapıyoruz. Bunun nedeni kodumuzun hem FireFox hem
Safari hem de Internet Explorer'da çalışmasını sağlayabilmek.
Yaptığımız şeyi kabaca tanımlamak gerekirse aslında tarayıcının
MouseScroll durumunu kendi tanımladığımız ScrollOldu adında bir
JavaScript fonksiyonun yönlendiriyoruz. Bir anlamda kendi "event
handler
" yapımızı tanımlıyoruz.

Bir sonraki adımda artık yavaş yavaş ScrollOldu fonksiyonunu
yazmamız gerekiyor. Fakat bunun öncesinde birkaç ufak bilgiyi paylaşmak
istiyorum. ScrollOldu durumu birazdan göreceğimiz, kendisiyle
beraber gelen parametresinde scroll işleminin değerini getirir. Bu
değer farklı tarayıcılarda farklı şekillerde yakalanır. O nedenle biz de
bir çok kontrol yapıyor olacağız. Bahsettiğimiz değer aslında artı veya
eksi bir Integer değeridir ve ne kadar scroll edilmesi gerektiğini
tanımlar. Biz örneğimizde sadece bu değerin + veya - olup olmadığını
kontrol edeceğiz, scroll miktarı ile zoom'u doğrudan eşleştirmeyeceğiz.
Böylece farklı bilgisayarlarda scroll hızı farklı ayarlanmış ise bu
durum uygulamaya yansımayacak.

    var ScrollMiktari = 0;

    if (!event)

        event = window.event;

    if (event.wheelDelta)

    {

        ScrollMiktari = event.wheelDelta;

        if (window.opera)

            ScrollMiktari = -ScrollMiktari;

    }

    else if (event.detail)

        ScrollMiktari = -event.detail;

Yukarıdaki kodumuz ScrollOldu fonksiyonumuzun baş kısmı.
ScrollOldu fonksiyonumuza gelen event adındaki parametrenin
tarayıcıya göre var olup olmamasına göre farklı eşleştirmeler yapıyoruz.
event nesnesinin yine tarayıcıya göre wheelDelta özelliği var
oradan gerekli değeri yakalıyoruz, yoksa bu sefer detail
özelliğinden değerimizi alıyoruz. Bazı tarayıcılarda aşağıya doğru
scroll + değer anlamına gelirken bazılarında tam tersi olabiliyor.
Tarayıcılar arası farkların detaylarına girmeyeceğim fakat mantığı
anlamakta fayda var.

Artık ScrollMiktari değişkenimize scroll değerini aldıktan sonra
gelen değerin pozitif veya negatif olmasına göre Image nesnemizi
boyutlandırmamız gerekiyor.

    if (ScrollMiktari)

    {

        var Boyutlandir =
document.getElementById("SilverlightControl").content.findName("Boyutlandir");

        if (ScrollMiktari > 0)

        {

            Boyutlandir.ScaleX = Boyutlandir.ScaleX  + 0.1;

            Boyutlandir.ScaleY = Boyutlandir.ScaleX  +  0.1;

        }

        else

        {

            Boyutlandir.ScaleX = Boyutlandir.ScaleY - 0.1;

            Boyutlandir.ScaleY = Boyutlandir.ScaleY - 0.1;

        }

    }

Gördüğünüz gibi ilk başta sayfadaki Silverlight kontrolümüzü bularak
içerisinden Boyutlandir nesnemizi bir değişkene aktarıyoruz.
Sonrasında da ScrollMiktarı'nın durumuna göre Boyutlandir'in ScaleX
ve ScaleY değerlerini 0.1 artırıyor veya azaltıyoruz.

Son olarak yapmamız gereken işlem ise Silverlight uygulamamızın
bulunduğu sayfanın kendi içinde Scroll etmesini engellemek. Bunun için
de fonksiyonumuzun sonunda MouseScroll durumunu tarayıcının
değerlendirmesini sonlandırmak için olumsuz değerler geri döndürüyor
olacağız.

    if (event.preventDefault)

        event.preventDefault();

    event.returnValue = false;

Yazacağımız JavaScript kodları sonlandığında göre artık Page.xaml.js
dosyasının son halini inceleyebiliriz.

if (!window.UntitledProject1)

    window.UntitledProject1 = {};

 

UntitledProject1.Page = function()

{

}

 

UntitledProject1.Page.prototype =

{

    handleLoad: function(control,
userContext, rootElement)

    {

    if (window.addEventListener)

        window.addEventListener('DOMMouseScroll', ScrollOldu, false);

        document.onmousewheel = ScrollOldu;

        window.onmousewheel = document.onmousewheel;

    }

}

function ScrollOldu(event)

{

    var ScrollMiktari = 0;

    if (!event)

        event = window.event;

    if (event.wheelDelta)

    {

        ScrollMiktari = event.wheelDelta;

        if (window.opera)

            ScrollMiktari = -ScrollMiktari;

    }

    else if (event.detail)

        ScrollMiktari = -event.detail;

    if (ScrollMiktari)

    {

        var Boyutlandir =
document.getElementById("SilverlightControl").content.findName("Boyutlandir");

        if (ScrollMiktari > 0)

        {

            Boyutlandir.ScaleX = Boyutlandir.ScaleX  + 0.1;

            Boyutlandir.ScaleY = Boyutlandir.ScaleX  +  0.1;

        }

        else

        {

            Boyutlandir.ScaleX = Boyutlandir.ScaleY - 0.1;

            Boyutlandir.ScaleY = Boyutlandir.ScaleY - 0.1;

        }

    }

    if (event.preventDefault)

        event.preventDefault();

    event.returnValue = false;

}

Hepinize kolay gelsin.