Makale Özeti

Bu yazımızda Silverlight 1.0 ve 2.0 Beta 2 ile beraber ClipBoard'dan veri alarak veri göndermeyi inceliyoruz.

Makale

Silverlight uygulamaları içerisinden "Clipboard"a ulaşmak istediğinizde maalesef hazır bir altyapı ile en azından şimdilik Silverlight 2.0 Beta 2 içerisinde karşılaşmıyoruz. Aynı şekilde Silverlight 1.0 içerisinde de bu sorun için bir çözüm yok. Fakat özellikle Silverlight 1.0 tarafında zaten JavaScript'in ana programlama yapısı olduğunu düşünürsek "Acaba tarayıcı içerisinde JavaScript ile bir çözüm oluşturabilir miyiz?" sorusu akla geliyor. Bu sorunun cevabı en azından Internet Explorer için "Evet". FireFox varsayılan ayarları ile bu gibi işlemlere JavaScript tarafında olanak tanımıyor.

Silverlight 1.0 ile Clipboard kullanımı

Yeni bir Silverlight 1.0 projesi yaratarak içerisine bir TextBlock ve Rectangle yerleştirelim. Yapacağım işlem TextBlock içerisinde yazılı metni Rectangle'a basıldığında ClipBoard'a taşımak olacak.

<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">

  <TextBlock Width="274.242" Height="43.939" Canvas.Left="31.818" Canvas.Top="27.273" Text="Kopyalanacak Metin" TextWrapping="Wrap" x:Name="Etiket"/>

  <Rectangle MouseLeftButtonDown="Kopyala" Width="122.727" Height="43.939" Fill="#FFFF0000" Stroke="#FF000000" Canvas.Left="31.818" Canvas.Top="92.425" RadiusY="16.167" RadiusX="16.167" x:Name="Dugme"/>

</Canvas>

Yukarıdaki kod uygulamamızın görsel arayüzünü oluşturuyor. "Dugme" adındaki Rectangle nesnemizin MouseLeftButtonDown durumunda çalıştırılacak olan kodu birazdan yazacağız.

function Kopyala(sender)

{

    window.clipboardData.setData("text", sender.findName("Etiket").Text); 

}

Kodumuz içerisinde kullandığımız clipboardData sınıfı ile ilgili detaylara MSDN üzerinden ulaşabilirsiniz. setData metodu toplamda iki parametre alıyor; bunlardan ilki ClipBoard'a kopyalanacak olan verinin tipi, ikincisi ise kopyalanacak olan içeriğin ta kendisi. Aynı şekilde isterseniz ClipBoard'dan veri almak için getData metodunu da kullanabilirsiniz.

function Getir(sender)

{

    sender.findName("Etiket").Text = window.clipboardData.getData("text");   

}

getData metodu sadece ClipBoard'dan alacağı verinin tipini parametre olarak alarak geriye doğrudan elde ettiği veriyi döndürüyor.

Peki ya Silverlight 2.0 tarafında neler yapacağız?

Aslında çok farklı bir işlem yapmayacağız. Silverlight 2.0 Beta 2 tarafında da şimdilik JavaScript'in nimetlerinden faydalanmak zorundayız. O nedenle istemci tarafındaki VB veya C# kodumuz ile sayfanın JavaScript tarafındaki özelliklerine ulaşıp yine JavaScript tarafındaki metodlarını çalıştıracağız.

İlk olarak Silverlight 2.0 Beta 2 uygulamamızın arayüzünü aşağıdaki şekilde düzenleyelim.

<UserControl x:Class="SilverlightApplication14.Page"

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

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

   Width="400" Height="300">

    <Grid x:Name="LayoutRoot" Background="White">

        <TextBox Height="40" HorizontalAlignment="Left" Margin="16,8,0,0" VerticalAlignment="Top" Width="120" Text="Herhangi bir Metin" TextWrapping="Wrap" x:Name="txtMetinKutusu"/>

        <Button Height="24" HorizontalAlignment="Left" Margin="16,72,0,0" VerticalAlignment="Top" Width="88" Content="Kopyala" x:Name="btnKopyala"/>

        <Button Height="24" HorizontalAlignment="Left" Margin="16,112,0,0" VerticalAlignment="Top" Width="88" Content="Yapıştır" x:Name="btnYapistir"/>

    </Grid>

</UserControl>

Bir TextBox ve iki Button'dan oluşan uygulamamızın ilk olarak kopyalama işlemini yapacak olan kodunu yazalım.

[VB]

    Private Sub btnKopyala_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnKopyala.Click

        Dim Clipboard As Browser.ScriptObject = Browser.HtmlPage.Window.GetProperty("clipboardData")

        Clipboard.Invoke("setData", "text", txtMetinKutusu.Text)

    End Sub

[C#]

        void btnKopyala_Click(object sender, RoutedEventArgs e)

        {

            System.Windows.Browser.ScriptObject Clipboard = (System.Windows.Browser.ScriptObject)System.Windows.Browser.HtmlPage.Window.GetProperty("clipboardData");

            Clipboard.Invoke("setData", "text", txtMetinKutusu.Text).ToString();

        }

Kodumuz içerisinde ilk olarak tarayıcının clipboardData sınıfını yakalamamız gerekiyor. Bunun için içerisinde olduğumuz tarayıcının (Browser) yine mevcut HTML sayfasının (HtmlPage) ait olduğu pencereyi (Window) yakalayıp onun üzerinden GetProperty ile clipboardData'yı alarak ScriptObject tipinde yarattığımız Clipboard değişkenimize aktarıyoruz. Sonrasında doğrudan değişkenimiz üzerinden Invoke diyerek aynı Reflection yapar gibi setData metodunu çalıştırıyoruz. Normal şartlarda JavaScript tarafına vereceğimiz parametreleri de yine Invoke metoduna aktarıyoruz. Böylece kopyalama işlemini tamamlamış olduk. Aynı şekilde ClipBoard'dan veri almayı da hemen getData ile yapabiliriz.

[VB]

    Private Sub btnYapistir_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnYapistir.Click

        Dim Clipboard As Browser.ScriptObject = Browser.HtmlPage.Window.GetProperty("clipboardData")

        txtMetinKutusu.Text = Clipboard.Invoke("getData", "text")

    End Sub

[C#]

        void btnYapistir_Click(object sender, RoutedEventArgs e)

        {

            System.Windows.Browser.ScriptObject Clipboard = (System.Windows.Browser.ScriptObject)System.Windows.Browser.HtmlPage.Window.GetProperty("clipboardData");

            txtMetinKutusu.Text = Clipboard.Invoke("getData", "text").ToString();

        }

Clipboard'dan veri alırken de aynı şekilde clipboardData nesnemizi yakaladıktan sonra bu sefer getData metodunu çalıştırıyoruz ve geriye dönen değeri de örneğimizde TextBox içerisine yazdırıyoruz.

C# kullananların haricen aşağıdaki şekilde uygulama başlangıcında Event-Handlar bağlantılarını yapmaları gerekecektir. VB kodlarındaki Handles keyword'ü ile bu işlem satır içinde yapılabildiği için ek olarak yazmak gerekmiyor.

[C#]

        public Page()

        {

            InitializeComponent();

            btnKopyala.Click += new RoutedEventHandler(btnKopyala_Click);

            btnYapistir.Click += new RoutedEventHandler(btnYapistir_Click);

        }

Böylece hem Silverlight 1.0 hem 2.0 içerisinde Clipboard'dan veri alarak veri aktarımı yapabildik. Tabi tüm bu işlemlerin sadece Internet Explorer içerisine olması üzücü. Diğer tarayıcılar için de geçerli olacak şekilde umarız ileride Silverlight Runtime içerisine standart işlevsellikler eklenir.

Hepinize kolay gelsin.