Sem GÖKSU - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Çalışmalarım | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim
İçerik Kategorileri
Makale Kategorileri
Etiket Bulutu
Arama
Tema
Kaynaklar
Takip Ettiklerim

Silverlight 3 Beta

Silverlight 3 Beta - Lokal Mesajlaşma (Local Messaging)


Silverlight 3 Beta ile birlikte gelen Local Messaging(Lokal Mesajlaşma) özelliği ile iki Silverlight uygulaması arasında iletişim kurup birbirlerine mesajlar göndermesini sağlayabiliyoruz. İster bir sayfada ki iki Silverlight uygulaması arasında, ister sekmeler(tab) arasında ki sayfaların içerisinde yer alan Silverlight uygulamalarında ve istersek farklı browserlar da bulunan Silverlight uygulamalarının birbirleriyle haberleşmesini sağlayıp buna bağlı olarak çeşitli işlemler yapıp birbirleri arasında veri alışveriş yapabiliyoruz. Yani Internet Explorer da çalışan bir Silverlight uygulaması, Safari de çalışan Silverlight uygulamasına bir mesaj gönderebiliyor. Safari de çalışan uygulama da bu mesaja bağlı olarak işlemler yapabiliyor. System.Windows.Messaging namespace’i altında mesaj göndermek ve mesajı almak için 2 sınıf var. Mesajı göndermek için LocalMessageSender, Mesajı almak için LocalMessageReceiver sınıfını kullanıyoruz.

Yeni bir Silverlight uygulaması oluşturalım. Bu uygulama bizim için başka bir uygulama ile iletişim kurup o uygulamaya mesaj gönderecek. Bu uygulama içinde bir TextBox ve bir de Button olsun. Butona bastığımızda TextBox’a girilen bilgiyi diğer uygulamaya göndereceğiz.

[XAML]
<UserControl xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006”
x
:Class="Silverlight30LocalMessaging.MainPage" Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox x:Name="txtMessage" Margin="82,86,86,0" VerticalAlignment="Top" Text="" TextWrapping="Wrap"/>
        <Button x:Name="btnGonder" Margin="163,124,173,0"VerticalAlignment="Top" Content=" Gönder"/>
    </Grid>
</UserControl>

Butona tıklandığında mesaj gönderme işlemini yapacağız, bunun için ilk olarak Click eventini oluşturalım. Bu Event içinde mesajı gönderebilmemiz için postaci isminde LocalMessageSender nesnesi oluşturalım. LocalMessageReceiver nesnesinin SendAsync metodunda alıcıya göndereceğimiz bilgiyi bildiriyoruz. Mesaj gönderildiğinde tetiklenen SendCompleted isminde bir event var. Bu eventinin eventargument’in Response özelliği ile mesajı alanın bize gönderdiği cevabı alabiliriz.

[C#]
namespace Silverlight30LocalMessaging
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            // Button için Click Eventini oluşturalım.
            this.btnGonder.Click += new RoutedEventHandler(btnGonder_Click);
        }

        void btnGonder_Click(object sender, RoutedEventArgs e)
        {
 
            // Local Messaging özelliğini kullanabilmemiz için System.Windows.Messaging namespace’i altında yer alan Local MessageSender sınıfını kullanıyoruz. Yapıcı metotda alıcı için bir isim belirtiyoruz.
            System.Windows.Messaging.LocalMessageSender postaci = new System.Windows.Messaging.LocalMessageSender("Adres");
 
            // Gönderilecek olan mesajı SendAsync metodu ile gönderiyoruz. 

            postaci.SendAsync(txtMessage.Text);
 
            // Mesaj yerine gettiğinde çalışacak olan eventi oluşturalım.

            postaci.SendCompleted += new EventHandler<System.Windows.Messaging.SendCompletedEventArgs>(postaci_SendCompleted); 
        }

        // Mesaj yerine gettiğinde çalışacak olan event. Mesajı alan silverlight uygulaması geriye bir yanıt gönderebilir, e.Response özelliği ile alıcının bize yolladığı bu yanıtı verir.

        void postaci_SendCompleted(object sender, System.Windows.Messaging.SendCompletedEventArgs e)
        {
            MessageBox.Show(e.Response);
        }
    }
}

Mesajı gönderdik, mesajı alacak bir alıcı yani başka bir Silverlight uygulamasına ihtiyacımız var. Bunun için bir Silverlight uygulaması daha oluşturalım. Bu uygulamada sadece TextBlock olsun. TextBlock kontrolünün text özelliğinde gönderilen mesajı görüntüleyeceğiz.

[XAML]
<UserControl x:Class="Silverlight30LocalMessagingAlici.MainPage"
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">
        <TextBlock x:Name="tbAlici" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
    </Grid>
</
UserControl>

Uygulama çalıştığında Mesajları alabilmek için alici adında LocalMessageReceiver nesnesi oluşturalım. LocalMessageReceiver nesnesinin gönderilen mesajları alabilmesi için Listen metodunu çağırmamız gerekir. Uygulamaya Mesajlar asenkron olarak gelecektir, Mesaj geldiğinde haberdar olabilmemiz için MessageReceived isimli bir event var. Bu event ile gelen mesajı alıp, mesajı gönderene cevap gönderebiliriz. Gelen mesajı almak için MessageReceived eventinin argümanları arasında Message isimli bir özellik var. Mesajı gönderene cevap göndermek için de Response özelliğini kullanabiliyoruz

[C#]
namespace Silverlight30LocalMessagingAlici
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            // Uygulama çalıştığında çalışacak olan event.

            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
 
            // Uygulama çalıştığında mesajın alınabilmesi için LocalMessageReceiver nesnesini oluşturalım. Yapıcı metodunda gönderen tarafında bildirilen adresi bildiriyoruz.

            System.Windows.Messaging.LocalMessageReceiver alici = new System.Windows.Messaging.LocalMessageReceiver("Adres");
 
            // Alıcıyı mesajları alabilmesi için açıyoruz. Alici dinlemeye başladı…

            alici.Listen(); 
            // Mesaj geldiğinde çalışacak olan eventi oluşturalım.
            alici.MessageReceived += new EventHandler<System.Windows.Messaging.MessageReceivedEventArgs>(alici_MessageReceived);
        }

        void alici_MessageReceived(object sender, System.Windows.Messaging.MessageReceivedEventArgs e)
        {
 
            // Mesaj geldi, EventArgument’de Response isimli bir özellik var. Bu özellik mesajı gönderene bir yanıt gönderiyor.

            e.Response = "Teşekkürler, Mesaj alındı !";
 
            // EventArgument’in Message özelliği bize gönderilen mesajı veriyor. 

            tbAlici.Text = e.Message; 

            // EventArgument’in SenderDomain özelliği mesajı gönderen uygulamanın adresini veriyor. 
            // e.SenderDomain; 

        }
    }
}

Şimdi uygulamalarımızı test edelim, iki uygulamayı da çalıştıralım.

Resim 1

Farklı browserlar da test edelim, Chrome’da mesajı gönderen uygulamayı çalıştıralım.

Resim 2

Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)

Sem GÖKSU
www.semgoksu.com | www.yazilimgunlugu.com
sem.goksu@yazilimgunlugu.com

Kaynaklar

msdn.com
silverlight.net

Bu makaleye 3 yorum yapılmış. | 11.04.2009 22:10:41

INETA NEXT HIT !


11 Nisan
09.30-10.00    Açılış
10.00-10.45    Windows 7 Deep-Dive  - Mehmet Nuri Çankaya
11.00-13.00    Silverlight 3.0 - Daron Yöndem
14.00-15.30    Bulut Bilişimi ve Azure - Panel
16.00-17.00    PHP On Windows ve Hyper-V - Muammer Benzeş

12 Nisan
10.00-12.00    Sürpriz Oturum - Daron Yöndem
13.00-15.00    ASP.NET 4.0 - Uğur Umutluoğlu
15.15-17.00    WCF 4.0 ve WF 4.0 - Burak Selim Şenyurt

Aktivite Yıldız Teknik Üniversitesi, Beşiktaş Kampüsü Oditoryumu'nda gerçekleşecek. Katılım için inetatr.org adresinden kayıt yaptırmanız yeterli.

Bu makaleye henüz yorum yapılmamış. | 01.04.2009 10:36:00

Silverlight 3 Beta - Data Kontrolleri ile İş Uygulamaları Geliştirme


Silverlight 3 Beta ile birlikte data kontrollerinin çok geliştirildiğini önceki yazılarımda özellikle vurgulamıştım. Bu makalemizde de bu data kontrollerini kullanarak bir iş uygulaması geliştireceğiz. Uygulamamızda kategoriler ve bu kategoriler ait ürünlerin listelendiği bir uygulama geliştireceğiz. DataForm kontrolünde kategorileri, DataGrid kontrolünde de bu kategoriye ait olan ürünleri listeleyeceğiz. Eğer bu kontroller ile ilgili yeterince bilgimiz yoksa öncelikle aşağıdaki makaleleri okumanızı öneririm.

DataGrid Kontrolü
DataGrid Kontrolü Kolon Yapıları
Web-Servisten Gelen Verinin Listelenmesi
DataForm Kontrolüne Genel Bakış

Yeni bir Silverlight projesi oluşturalım. Örneğimizde SQL Server 2005 örnek veritabanı olan AdventureWorks’u kullanacağız. Silverlight da doğrudan veritabanı erişimi olmadığı için XML Web servisi ile veriyi alacağız. Bunun için projemize web servisi ekleyelim. Servisimizin içinde Urun ve Kategori için iki nesne ve iki metot oluşturalım. İlk metot kategoriler için ikincisi de ürünler için olacak.

[WebService1.asmx]
publicclass WebService1 : System.Web.Services.WebService
{ 
    public class Kategori // Kategoriler için Entity
    {
        public int KategoriID { get; set; }
        public string KategoriAdi { get; set; }
    }

    public class Urun // Ürünler için Entity
    {
        public int UrunID { get; set; }
        public string UrunAdi { get; set; }
        public decimal ListeFiyati { get; set; }
    }

    [WebMethod]
    public List<Kategori> KategorileriGetir()// Web servisten geriye dönecek olan kategori listesi
    {
        List
<Kategori> kategoriler = new List<Kategori>();
        SqlConnection
cnn = new SqlConnection("server=.; DataBase=AdventureWorks; uid=sa; pwd=sa12345");
        SqlCommand
cmd = new SqlCommand("Select ProductSubCategoryID, Name From Production.ProductSubCategory", cnn);
        cnn.Open();
        SqlDataReader
dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            kategoriler.Add(new Kategori() { KategoriID = dr.GetInt32(0), KategoriAdi = dr.GetString(1) });
        }
        cnn.Close();
        return kategoriler;
    }

    [WebMethod]
    public List<Urun> UrunleriGetir(int ProductSubcategoryID)//Web servisten geriye dönecek olan Ürün Listesi. Parametre olarak CategoryID’yi aldı. 
    {
        List<Urun> urunler = new List<Urun>();
        SqlConnection cnn = new SqlConnection("server=.; DataBase=AdventureWorks; uid=sa; pwd=sa12345");
        SqlCommand cmd = new SqlCommand("Select ProductID, Name, ListPrice From Production.Product Where ProductSubCategoryID=@ProductSubCategoryID", cnn);
        cmd.Parameters.AddWithValue("@ProductSubcategoryID", ProductSubcategoryID);
        cnn.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            urunler.Add(new Urun() { UrunID = dr.GetInt32(0), UrunAdi = dr.GetString(1), ListeFiyati = dr.GetDecimal(2) });
        }
        cnn.Close();
        return urunler;
    }
}


Servisimiz hazır. Şimdi Silverlight uygulamamıza dönelim. Silverlight formumuza bir DataGrid ve DataForm ekleyelim. DataForm kontrolünün fieldlarını istersek kendimiz de oluşturabiliriz. Bunun için AutoGenerateFields özelliğini false yapalım ve fieldlarını kendimiz belirleyelim. Aynı şekilde DataGrid kontrolünün de kolonlarının otomatik olarak oluşmasını engelleyelim ve kolonlarını kendimiz belirleyelim.

[XAML]
<UserControl xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm" xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SL3DataFormGridVew.MainPage"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
Width="500" Height="360">
// Animasyon da olsun
<UserControl.Resources>
    // Silverlight 3 Beta ile gelen easing animasyonları kullanalım.
    <Storyboard x:Name="oyna">
        <DoubleAnimation Storyboard.TargetName="dgUrunler" Storyboard.TargetProperty="Opacity" From=".2" To="1" Duration="00:00:01">
            // DoubleAnimastion’ın EasingFunction isimli dependency bir property’si var. Bu Property herhangi bir easing animasyonu atayabiliriz.
            <DoubleAnimation.EasingFunction>
                <
QuarticEase EasingMode="EaseInOut"></QuarticEase>
            </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
    </
Storyboard>
</UserControl.Resources>
<Canvas x:Name="LayoutRoot" Background="White">
    // Kategorilerin listeleneceği DataForm Kontrolü. AutoGenerateFields özelliğini false yaptık ve içerisinde ki fieldlar otomatik olarak oluşturulmasını engelledik.
    <dataControls:DataForm x:Name="dgKategoriler" AutoGenerateFields="False" Width="480" Canvas.Top="10" Canvas.Left="10" Height="150">
        // DataForm kontrolünün fiedlarını belirliyoruz.
        <dataControls:DataForm.Fields>
            // Yeni bir field ekliyoruz.
            // FieldLabelContent => Kontrolün etiket bilgisi
            // isReadOnly => Bu fieldda yer alan Kontrol sadece okunabilir olacak
            // Binding => Verikaynağından gelen değeri bağlıyoruz.
            // FieldLabelPosition => Kontrolün eiketi nerede görünsün
            <dataControls:DataFormTextField FieldLabelContent="Kategori ID" IsReadOnly="True" Binding="{Binding KategoriID}" FieldLabelPosition="Top">
            </dataControls:DataFormTextField>
            <
dataControls:DataFormTextField FieldLabelContent="Kategori Adı" Binding="{Binding KategoriAdi}" FieldLabelPosition="Top">
            </
dataControls:DataFormTextField>    
        </dataControls:DataForm.Fields>
    </dataControls:DataForm>
     // Kategoriye ait ürünlerin yer aldığı DataGrid Kontrolü. AutoGenerateColumns özelliğini false yaparak kolonların otomatik olarak oluşturulmasını engelledik.
    <data:DataGrid x:Name="dgUrunler" AutoGenerateColumns="False" Canvas.Top="170" Canvas.Left="10" Width="480" Height="180">
        // Datagrid’e kolonları ekleyelim
        <data:DataGrid.Columns>
            // Header => Kolonum başlık bilgisi
            // Binding => Verikaynağından gelen değeri bağlıyoruz.
            <data:DataGridTextColumn Header="Ürün ID" Binding="{Binding UrunID}"></data:DataGridTextColumn>
            <
data:DataGridTextColumn Header="Ürün Adı" Binding="{Binding UrunAdi}"></data:DataGridTextColumn>
            <data:DataGridTextColumn Header="Liste Fiyatı" Binding="{Binding ListeFiyati}"></data:DataGridTextColumn>
        </
data:DataGrid.Columns>
    </
data:DataGrid>
</Canvas>
</
UserControl>


Dizayn olarak her şey hazır. Artık Web servise bağlanıp verileri çekebiliriz. Bunun için Silverlight projemize gelelim ve sağ tıklayarak “Add Service Reference” diyelim. Discover butonuna tıkladığımız da servisi otomatik olarak bulacaktır. OK butonuna basalım ve servisi ekleyelim.

Resim 1

Servise bağlandıktan sonra yapmamız gereken tek şey servisten gelen veriyi kontrollere bağlamak olacak.

[C#]
public partial class MainPage : UserControl
{
    // Web Servis’in örneğini oluşturalım
    WebService1SoapClient
servis = new WebService1SoapClient();
    public MainPage()
    {
        InitializeComponent();
        // Uygulama ilk yüklendiğinde çalışan Loaded event listenerini oluşturalım.
        this.Loaded += span style='color: blue'>new
RoutedEventHandler(MainPage_Loaded);
        // Hatırlayacak olursanız, Web servisleri varsayılan olarak Asenkron olarak çalışıyordu. Burada Servisten kategorilerin getirildiğinde çalışacak olan event listeneri oluşturalım.
        servis.KategorileriGetirCompleted += new EventHandler<SL3DataFormGridVew.ServiceReference1.KategorileriGetirCompletedEventArgs>(servis_KategorileriGetirCompleted);
        // DataForm kontrolünden kategoriler arasında geçerken çalışacak olan event listeneri luşturalım.
dgKategoriler.CurrentItemChanged += new EventHandler<EventArgs>(dgKategoriler_CurrentItemChanged);
        // Servisten Ürünler getirildikten sonra çalışacak olan event listeneri oluşturalım.
        servis.UrunleriGetirCompleted += new EventHandler<UrunleriGetirCompletedEventArgs>(servis_UrunleriGetirCompleted); 
    } 

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        // Servise Kategorileri getirecek olan metot için istekte bulunuyoruz.
        servis.KategorileriGetirAsync(); 
    }

    void servis_KategorileriGetirCompleted(object sender, SL3DataFormGridVew.ServiceReference1.KategorileriGetirCompletedEventArgs e)
    {
        // Gelen sonucu DataForm’un ItemsSource özelliğine bağlıyoruz.
        dgKategoriler.ItemsSource = e.Result;
    }

    void dgKategoriler_CurrentItemChanged(object sender, EventArgs e)
    {
        // Seçili olan elemanı bir kategori nesnesine atadık. Object döndüğü içinde cast ettik.
        Kategori kategori = (Kategori)dgKategoriler.CurrentItem;
        // Servise Ürünleri getirecek olan metot için istekte bulunuyoruz.
        servis.UrunleriGetirAsync(kategori.KategoriID);
    }

    void servis_UrunleriGetirCompleted(object sender, UrunleriGetirCompletedEventArgs e)
    {
        // Ürünler geldiğinde animasyonu oynatalım.
        oyna.Begin();
        // Gelen sonucu datagarid’in ItemsSource özelliğine bağlıyoruz.
        dgUrunler.ItemsSource = e.Result;
    }
}

Sonuca bakalım,

Resim 2

İstediğimiz gibi kayıtlar arasında gezinebilir ve ürünlerin de değiştiğini ve animasyonun da çalıştığını görebiliriz.. Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;) Makale de kullandığımız örneği indirmek için tıklayınız

Sem GÖKSU
www.semgoksu.com | www.yazilimgunlugu.com
sem.goksu@yazilimgunlugu.com

Kaynaklar
msdn.com
silverlight.net

Bu makaleye henüz yorum yapılmamış. | 31.03.2009 17:09:59

Silverlight 3 Beta – 3D Efektleri (Perspective Transforms)


Silverlight 2’nin en büyük eksiklerinden biri 3D efektlerinin olmamasıydı. Silverlight 3 Beta ile birlikte bu eksiklik de giderildi ve artık Silverlight uygulamalarında 3D efektlerini kullanabiliyoruz. Tabi şunu da özellikle belirtmekte fayda var. Silverlight henüz 3D-Engine desteklemiyor. Yani yaptığımız uygulama gerçek bir 3D uygulaması olmayacaktır.

Silverlight 3 Beta UIElementlerine 3D Efektleri uygulayabilmek için her UIElementin ”Projection” isimli bir propertysi var. Eğer bir kontrole 3D efekti uygulamak istiyorsak UIElementin Projection özelliğini kullanmak zorundayız. Örnek kullanımı aşağıdaki gibidir.

[XAML]
<UIElement.Projection>
<PlaneProjection Rotation="Deger"></PlaneProjection>
</
UIElement.Projection>

UIElementlerin Projection özelliği abstract bir tiptir. PlanProjection da bu tipten kalıtılarak oluşturulmuş bir tiptir. Böylece nesnelerin Projection özelliğine PlaneProjection tipini atayabiliriz.

[C#]
UIElement.Projection = new PlaneProjection() { Rotation = deger };

İlk olarak PlaneProjection tipinde yer alan bazı özellikleri inceleyelim. PlaneProjection'ın 12 tane özelliği var.

RotationX
UIElementin dönme merkezinin, X koordinatında döndürülmesini sağlar.

<Image Source="sllogo.jpg" Width="150" Height="170">
<Image.Projection>
    <PlaneProjection RotationX="-60"></PlaneProjection>
    </Image.Projection>
</
Image>

RotationY
UIElementin dönme merkezinin, Y koordinatında döndürülmesini sağlar.

<Image Source="sllogo.jpg" Width="150" Height="170">
<Image.Projection>
    <PlaneProjection RotationY="-60"></PlaneProjection>
    </Image.Projection>
</
Image>

RotationZ
UIElementin dönme merkezinin, Z koordinatında döndürülmesini sağlar.

<Image Source="sllogo.jpg" Width="150" Height="170">
<Image.Projection>
    <PlaneProjection RotationZ="-60"></PlaneProjection>
    </Image.Projection>
</
Image>

CenterOfRotationX, CenterOfRotationY, CenterOfRotationZ özelliklerini kullanarak nesnenin dönme merkezini taşıyabiliriz. Bu özellikler 0 ile 1 arasında bir değer alabilir. 0 En üst nokta 1 ise an alt noktadır. Default değerleri x ve y için 0.5, z için 0’dır.

<Image Source="sllogo.jpg" Width="150" Height="170">
    <Image.Projection> 
    <PlaneProjection RotationZ="-60" CenterOfRotationX="0.6"></PlaneProjection> </Image.Projection>
</Image>

LocalOffsetX, X ekseninde nesne ile Plane(3D alanı) arasındaki mesafeyi belirler.
LocalOffsetY, Yekseninde nesne ile Plane(3D alanı) arasındaki mesafeyi belirler.
LocalOffsetZ, Z ekseninde nesne ile Plane(3D alanı) arasındaki mesafeyi belirler.
GlobalOffsetX, X ekseninde nesne ile ekran arasındaki mesafeyi belirler.
GlobalOffsetY, Y ekseninde nesne ile ekran arasındaki mesafeyi belirler.
GlobalOffsetZ,Z ekseninde nesne ile ekran arasındaki mesafeyi belirler.

Yeni bir Silverlight uygulaması oluşturalım ve projemize bir Rectangle, 6 slider ekleyelim. Rectangle nesnesinin Projection özelliğindeki Rotation X,Y Z ve CenterOfRotation X,Y,Z Özelliklerine bağlayacağız. Böylece Silverlight 3 Beta ile gelen bir diğer yenilik olan Kontrollerin birbirine bağlanması konusunu incelemiş olacağız. XAML kodumuz aşağıdaki gibidir.

[XAML]
<Canvas x:Name="LayoutRoot" Background="White" Width="400" Height="300" >

// Rectangle nesnesi oluşturalım

<Rectangle x:Name="Kare" Width="100" Height="100" Fill="Red" Canvas.Top="50" Canvas.Left="140">
    // Projection özelliğine PlaneProjecytion nesnesi ile 3D efektleri için özellikleri belirleyelim.
    // Rectangle nesnesinin CenterOfRotation özelliklerini belirledik. Böylece nesnenin dönme merkezi default değerler olarak atandı
    <Rectangle.Projection>
    <PlaneProjection x:Name="Kare3d" CenterOfRotationX="0.5" CenterOfRotationY="0.5" CenterOfRotationZ="0"/>
</Rectangle.Projection>
</Rectangle>

// Kare3d isimli PlaneProjection nesnesinin RotationX özelliğini slider kontrolünün value özelliğine bağlıyoruz. Böylece slider kontrolünün valuesi değiştikçe Nesnenin RotationX özelliğide değişecek.
<Slider Minimum="0" Maximum="360" Width="180" Value="{Binding ElementName=Kare3d, Mode=TwoWay, Path=RotationX}" Canvas.Left="20" Canvas.Top="200"/>

// Kare3d isimli PlaneProjection nesnesinin RotationY özelliğini slider kontrolünün value özelliğine bağlıyoruz. Böylece slider kontrolünün valuesi değiştikçe Nesnenin RotationY özelliğide değişecek.

<
Slider Minimum="0" Maximum="360" Width="180" Value="{Binding ElementName=Kare3d, Mode=TwoWay, Path=RotationY}" Canvas.Left="20" Canvas.Top="230" />

// Kare3d isimli PlaneProjection nesnesinin RotationZ özelliğini slider kontrolünün value özelliğine bağlıyoruz. Böylece slider kontrolünün valuesi değiştikçe Nesnenin RotationZ özelliğide değişecek.
<Slider Minimum="0" Maximum="360" Width="180" Value="{Binding ElementName=Kare3d, Mode=TwoWay, Path=RotationZ}" Canvas.Left="20" Canvas.Top="260"/>


// Kare2 nesnesinin  CenterOfRotationX özelliğini slider kontrolünün value özelliğine bağlıyoruz. Böylece slider kontrolünün valuesi değiştikçe Nesnenin CenterOfRotationX özelliğide değişecek.
<Slider Minimum="0" Maximum="1" Width="180" Value="{Binding ElementName=Kare3d, Mode=TwoWay, Path=CenterOfRotationX}" Canvas.Top="200" Canvas.Left="210"/>

// Kare3d isimli PlaneProjection nesnesinin CenterOfRotationY özelliğini slider kontrolünün value özelliğine bağlıyoruz. Böylece slider kontrolünün valuesi değiştikçe Nesnenin CenterOfRotationY özelliğide değişecek.

<Slider Minimum="0" Maximum="1" Width="180" Value="{Binding ElementName=Kare3d, Mode=TwoWay, Path=CenterOfRotationY}" Canvas.Top="230" Canvas.Left="210"/>

// Kare3d isimli PlaneProjection nesnesinin CenterOfRotationZ özelliğini slider kontrolünün value özelliğine bağlıyoruz. Böylece slider kontrolünün valuesi değiştikçe Nesnenin CenterOfRotationZ özelliğide değişecek.

<Slider Minimum="0" Maximum="1" Width="180" Value="{Binding ElementName=Kare3d, Mode=TwoWay, Path=CenterOfRotationZ}" Canvas.Top="260" Canvas.Left="210"/>

// Bilglendirme için kullanacağımız TextBlock kontrolleri
<TextBlock Canvas.Top="180" Canvas.Left="20" Width="87" Height="16" FontWeight="Bold" Text="Rotation">TextBlock>
<TextBlock Canvas.Top="180" Canvas.Left="210" Height="16" Width="118" Text="CenterOfRotation" FontWeight="Bold"/>
<TextBlock Canvas.Top="200" Canvas.Left="4" Height="16" Width="8" Text="X" FontWeight="Bold"/>
<TextBlock Canvas.Top="230" Canvas.Left="4" Height="16" Width="8" Text="Y" FontWeight="Bold"/>
<TextBlock Canvas.Top="260" Canvas.Left="4" Height="16" Width="8" Text="Z" FontWeight="Bold"/>

</Canvas>



Uygulamayı test edebiliriz artık. Test etmek için tıklayınız

Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)

Sem GÖKSU
www.semgoksu.com | www.yazilimgunlugu.com
sem.goksu@yazilimgunlugu.com

Kaynaklar

MSDN
Silverlight SDK

Bu makaleye 1 yorum yapılmış. | 24.03.2009 22:59:05

Silverlight 3 Beta – SaveFileDialog Kullanımı


Silverlight 3 Beta ile birlikte gelen SaveFileDialog ile Silverlight uygulamasındaki bir dosyayı istemci kullanıcının makinesine kaydetmemizi sağlar. Hatırlatmak da fayda var, Silverlight 2.0 ile birlikte de OpenFileDialog kontrolü Silverlight kontrol kütüphanesine eklenmişti. Bu kontrolle de istemcinin makinesindeki bir dosyayı Silverlight uygulaması içinde kullanabiliyoruz. Şöyle bir şey yapabiliriz artık, OpenFileDialog ile bir dosyayı alıp üzerinde değişiklik yapıp, SaveFileDialog kontrolü ile de kaydedebiliriz. SaveFileDialog kontrolünün bazı önemli özelliklerini inceleyecek olursak;

Filter özelliği ile SaveFileDialog ile kaydedilecek dosyanın uzantısını yada uzantılarını bu özellikle belirleyebiliri

FilterIndex özelliği ile filtreler içinde bulunan seçeneklerden hangisinin seçileceğini belirleriz.

DefaultExt özelliği ile herhangi bir filter seçmezsek DefaultExt özelliği ile belirttiğimiz uzantıyı alır

ShowDialog metodu ile SaveFileDialogu ekranda gösterebiliyoruz. Geriye Boolen bir değer döndürür.

Silverlight uygulamasında kullanıcıların Text dosyalarını açıp bu dosyalar üzerinde değişiklik yapıp kaydetmesini sağlayacak bir uygulama geliştirelim. Böylece hem OpenFileDialog hemde SavaFileDialog nesnelerini incelemiş olacağız. Bunun için Silverlight projesi oluşturalım. Projemize aç, kaydet için iki buton ve dosyadaki içeriği görüntülemek içinde bir textbox ekleyelim.

Resim 1

[XAML]
<UserControl x:Class="SL3BetaSaveFileDialogKontrolu.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300">
<Canvas x:Name="LayoutRoot" Background="White">
    <Button x:Name="btnAc" Content="Aç" Width="100" Height="30" Canvas.Top="10" Canvas.Left="10"></Button>
    <
Button x:Name="btnKaydet" Content="Kaydet" Width="100" Height="30" Canvas.Left="120" Canvas.Top="10"></Button>
    <TextBox x:Name="txtIcerik" Text="İçerik" Width="380" Height="240" Canvas.Left="10" Canvas.Top="50"></TextBox>
</Canvas>
</
UserControl>

İlk olarak dosyayı OpenFileDialog nesnesini kullanarak açalım ve textbox kontrolün de gösterelim.

[OpenFileDialog]
void btnAc_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog dosyaAc = new OpenFileDialog(); // OpenFileDialog nesnesi oluşturalım.
    dosyaAc.Multiselect = false; // Çoklu seçime izin vermeyelim.
    dosyaAc.Filter = "Text Dosyaları(*.txt)|*.txt"; // Açılacak olan dosyanın uzantısı
    if (dosyaAc.ShowDialog() == true) // Bir dosya seçilmezse yada iptal’e basılırsa hata vermemesi için kontrolümüzü yapalım
    {
        string contents = "";
        StreamReader reader = new StreamReader(dosyaAc.File.OpenRead(), System.Text.Encoding.UTF8); // OpenFileDialog nesnesi ile açılan dosyayı StreamReader ile okuyalım.
        while(!reader.EndOfStream) // Okunan dosya sona geldimi
        {
            contents = reader.ReadToEnd();// Sonuna kadar oku
        }
        txtIcerik.Text = contents; // Okunan dosyanın içeriğini textbox’a ata.
        reader.Close(); // Okuyucuyla işimiz bitti kapatalım.
    }
}


Şimdide kullanıcının dosyayı SaveFileDialog nesnesi kullanarak kaydetmesini sağlayalım.

[SaveFileDialog]
void btnKaydet_Click(object sender, RoutedEventArgs e)
{
    SaveFileDialog dosyaKaydet = new SaveFileDialog(); //SaveFileDialog nesnesi oluşturalım.
    dosyaKaydet.Filter = "Text Dosyası(txt)|*.txt"; // Kaydedilecek dosya sadece txt dosya olabilisin.
    if (dosyaKaydet.ShowDialog() == true)
    {
        StreamWriter writer = new StreamWriter(dosyaKaydet.OpenFile());//Seçilen dosyayı StreamWriter ile açalım…
        writer.Write(txtIcerik.Text);// Seçilen dosyaya içeriği atayalım.
        writer.Close(); // Yazıcıyı kapatmayı unutmayalım. 
    }
}

Bir dosya açalım ve dosyayı kaydedelim. Eğer dosya yoksa direk de kaydedebiliriz

Resim 2

Dosyayı kaydetmeye çalışalım. Masaüstüne kaydedelim,

Resim 3

Şimdi Masaüstüne bakalım,

Resim 4

Masaüstüne dosya kaydedilmiş, Dosyanın içine bakalım,

Resim 5

Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)

Sem GÖKSU
www.semgoksu.com | www.yazilimgunlugu.com
sem.goksu@yazilimgunlugu.com

Kaynaklar
msdn.com
silverlight.net

Bu makaleye 2 yorum yapılmış. | 24.03.2009 14:42:41

1 2 3
Ana Sayfa | Hakkımda | Çalışmalarım | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Sem Göksu 2004-2009 © Tüm Hakları Saklıdır.