Makale Özeti

Bu makalemizde WPF Windows uygulamalarında Application sınıfını kullanarak farklı pencereler arasında .NET objelerinin ve verilerimizin paylaştırılmasını inceleyeceğiz.

Makale

WPF Windows uygulamalarında klasik Windows uygulamalarında olduğu gibi birden çok pencere açarak kullanıcıların farklı pencerelerde aynı anda işlem yapmalarını sağlayabilirsiniz. Bu işlemler yapılırken iki veya daha fazla pencere arasında gerçek zamanlı olarak veri aktarımı gerekebilir. Bu tip bir durumda WPF uygulamalarında kullanabileceğimiz Application objesi yardımımıza yetişiyor. Uygulama içerisindeki tüm XAML sayfaları ve Classlar Application objesine erişerek herhangi bir tipteki objeyi, değişkeni kaydedebilir veya okuyabilir. Bir örnek ile bu işlemleri nasıl yapabileceğimizi inceleyelim.

Ön Hazırlık

Visual Studio ile WPF uygulamaları yaratabilmek için sistemimizde .NET Framework 3.0 ve gerekli Visual Studio Extension'larının kurulu olması gerekiyor. Yükleme paketlerini aşağıdaki linklerden indirebilirsiniz.

http://www.microsoft.com/downloads/details.aspx?familyid=10CC340B-F857-4A14-83F5-25634C3BF043&displaylang=en
http://www.microsoft.com/downloads/details.aspx?familyid=F54F5537-CC86-4BF5-AE44-F5A1E805680D&displaylang=en

Uygulama Açılışında Birden Çok Pencere Açmak

Visual Studio 2005 içerisinde yeni bir WPF Windows uygulaması başlatıyoruz. WPF Windows uygulamaları ilk açıldıklarında varsayılan pencereyi yüklerler. Bunun yanı sıra isterseniz farklı pencereleri de uygulama açılışında açabilirsiniz. Gerekli kodları yazmak üzere projemize ait App.xaml dosyasını açıyoruz.

' Interaction logic for App.xaml
Partial Public Class App
    Inherits System.Windows.Application
 
    Private Sub App_Startup(ByVal sender As Object, ByVal e As System.Windows.StartupEventArgs) Handles Me.Startup
        Dim x As New Window2
        x.Show()
    End Sub
End Class

Yukarıdaki kodumuzda Application'a ait StartUp durumunu kullanıyoruz. Uygulama ilk başlatıldığında Window2 adındaki penceremizden bir adet yaratarak kullanıcıya gösteriyoruz. Bu şekilde birden çok pencereyi uygulamanın ilk başında açmak mümkün. Açtığımız bu pencere kapatıldığında uygulamamızın da kapatılmasını istiyorsak söz konusu pencerelere aşağıdaki kodu yazmamız gerekecek.

    Private Sub Window2_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
        Application.Current.Shutdown()
    End Sub

Window2'ye ait Closing durumuna yazdığımız kod ile uygulamamızın tamamen kapatılmasını sağlıyoruz. Şimdi gelelim bu iki pencereyi birbiri ile konuşturmaya.

Farklı Pencerelerin İletişimi

Uygulalamızda ilk açılan pencere olan Window1 içerisinde aşağıdaki Class yapısını tanımlayalım.

    Public Class Adam
        Dim _Adi As String
        Dim _Soyadi As String
 
        Property Adi() As String
            Get
                Return _Adi
            End Get
            Set(ByVal value As String)
                _Adi = value
            End Set
        End Property
 
        Property Soyadi() As String
            Get
                Return _Soyadi
            End Get
            Set(ByVal value As String)
                _Soyadi = value
            End Set
        End Property
 
        Sub New()
 
        End Sub
 
        Sub New(ByVal Adi As String, ByVal Soyadi As String)
            Me.Adi = Adi
            Me.Soyadi = Soyadi
        End Sub
    End Class

Adam adındaki bu Class yapısı üzerinden bir adam değişkeni tanımlayacağız. Adam yapısına ait Adi ve Soyadi özelliklerine farklı değerler aktardıktan sonra bu yapıyı başka bir pencereyle paylaşacağız. İlk olarak gelin Window1'e ait XAML koduna bakalım.

Veri girişi yaptığımız WPF penceremiz.
Veri girişi yapacağımız WPF penceresi.

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF_Demo" Height="165" Width="301"
    >
    <Grid>
    <TextBox Height="26" ,
             Margin="51,16,142,0"
             Name="TextBox1"
             VerticalAlignment="Top"></TextBox>
    <Button Margin="52,51,0,58" Name="Button1"
            HorizontalAlignment="Left" Width="75">KAYDET</Button>
    <TextBox Height="26" HorizontalAlignment="Right"
             Margin="0,16,31,0" VerticalAlignment="Top"
             Width="100" Name="TextBox2" ></TextBox>
  </Grid>
</Window>

Penceremizde iki adet TextBox ve bir adet Button bulunuyor. Düğmeye tıklandığında aşağıdaki kod çalışarak kutular içerisinde yazan bilgiler çerçevesinde bir adam değişkeni yaratacak ve adını, soyadını belirleyecek. Sonrasında da sihirli kodumuzu kullanarak Application Class'ı ile veriyi kaydedecek.

    Private Sub Kaydet_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        Dim YeniAdam As New Adam(TextBox1.Text, TextBox2.Text)
        If Application.Current.Properties.Contains("Sahip") = False Then
            Application.Current.Properties.Add("Sahip", YeniAdam)
        Else
            Application.Current.Properties.Item("Sahip") = YeniAdam
        End If
    End Sub

Kodumuzda YeniAdam adındaki değişkenimizi yarattıktan sonra Application.Current diyerek mevcut uygulamayı yakalıyoruz. Mevcut uygulamanın Properties listesine farklı isimler vererek kayıtlar koyabiliriz. Bizim kaydımızın ismi Sahip olacak. Kayıt daha önce varsa sadece değiştiriyoruz. .Contains metodu ile kaydın daha önce eklenip eklenmediğini kontrol edebilirsiniz.

Kaydetme işlemimiz tamamlandığında göre Window2 penceremize ait XAML kodunu inceleyerek çalışmalarımıza Window2 üzerinde devam edelim.

<Window x:Class="Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF_Demo" Height="135" Width="289"
    >
    <Grid>
    <Button Margin="81,34,125,45" Name="Button1">Sahip Kim?</Button>
  </Grid>
</Window>

Window2 içerisinde sadece bir adet Button var. Düğmeye tıkladığımızda Window1 tarafından kaydedilen bilgiyi okuyarak kullanıcıya birer mesaj kutusu ile basit bir şekilde göstereceğiz. Kodumuz aşağıdaki şekilde olacak.

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        MessageBox.Show(Application.Current.Properties.Item("Sahip").adi)
        MessageBox.Show(Application.Current.Properties.Item("Sahip").soyadi)
    End Sub

Gördüğünüz gibi yine Application.Current diyerek uygulamamızın tüm Properties listesine ulaşabiliyoruz. Burada Sahip adındaki bilgiyi alarak aldığımız kişi değişkeninin Adi ve Soyadi özelliklerine ulaşabiliyoruz. Böylece her iki pencere de açıkken birinde yapılan değişiklikler kaydedilebilirken diğerinden de direk okunabilir veya her iki pencere de aynı obje üzerinde değişiklikler yapabilir. Değişiklikerin pencereler tarafından algılanmasını isterseniz Actived durumlarında Application üzerinden veriler tekrar alabilirsiniz.

Hepinize kolay gelsin.

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

Örnek uygulamamızın proje kodlarını bilgisayarınıza indirebilirsiniz.