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 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.
Örnek Uygulama Kaynak Dosyaları - 05092007_1.zip (417,09 KB)