Silverlight içerisinde ClipBoard kullanımı

0 dakikada yazıldı

8607 defa okundu

Düzenle

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.