Makale Özeti

Fare ile sürükle ve bırak işlemlerinin yanı sıra Silverlight uygulamalarında farenin roller aracını da kullanabiliriz. Bu makalemizde bir örnek ile bu işlevselliği nasıl sağlayabileceğimize değineceğiz.

Makale

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.

Daron Yöndem
MCT, MCPD, MCITP, MCTS, MCSD, MCAD
MCDBA, MCP, ACP, ICSD, IEL'03
http://daron.yondem.com