Makale Özeti

Windows 7 Taskbarında bulunan Thumbnail sistemini özelleştirmeyi incelediğimiz bu makalede kendi özel tablarımıza göre thumbnailleri yöneteceğiz.

Makale

Bir uygulama içerisinden birden çok pencerenin olduğu yılları hatırlarsınız dersem belki de "O yıllar geride mi kaldı?" diyebilirsiniz. MDI formları yıllarda uygulamalarımızın en önemli parçaları oldular. Kullanıcı deneyimi olarak olabildiğince onlardan kaçsak da farklı şekillerde de olsalar hep karşımıza çıkıyorlar. Sadece MDI formları değil aslında TAB içeren tüm mekanizmalara konumuza dahil edebiliriz. Örneğin Internet Explorer 8 içerisinde de birden çok tab açarak aslında apayrı işler yapabiliyoruz. Aynı program içerisinde çalışsak da aslında yaşanan deneyim son kullanıcı açısından ayrı bir program kullanmaktan çok da farklı olmuyor.

Internet Explorer içerisinden farklı tablar taskbarda...
Internet Explorer içerisinden farklı tablar taskbarda...

Şöyle bir düşünsek acaba bizim de hazırladığımız programlarda kullanıcıların böyle geçiş yapabilecekleri ekranlar var mıdır? Aynı uygulama içerisinden bir anda birden çok ekran üzerinde çalışan kullanıcılara taskbar üzerinden ulaşarak acaba bu ekranlara taskbardan da ayrı ayrı ulaşabileceklerini belirtebilsek güzel olmaz mıydı? Gelin bu durumda minik bir örnek ile bu işlevselliği programlarımıza nasıl katabileceğimize göz atalım.

Ön Hazırlıklar

Örnek WPF uygulamamızı yarattığımız gibi WindowsAPICodePack ile beraber gelen Microsoft.WindowsAPICodePack.dll ve Microsoft.WindowsAPICodePack.Shell.dll'i referans olarak projemize eklemeliyiz. Yarattığımız bu yeni WPF projesine ayrıca System.Drawing'i de referans alıp sonrasında XAML tarafına geçelim.

[XAML]

<Window x:Class="Window1"

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

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

   Title="Window1" Height="300" Width="300">

    <Grid>

        <Image x:Name="Resim" Source="Koala.jpg" />

        <Image x:Name="Resim2" Source="Desert.jpg" />

    </Grid>

</Window>

Yukarıdaki şekli ile uygulamamızın ana ekranında iki tane resim yer alacak. Bu resimler birbirlerinin üstündeler yani her zaman uygulama ekranında normal şartlarda sadece tek resim gözükebilir. Bu resimleri uygulamalarınız içerisinde farklı ekranlar olarak kabul edebilirsiniz. Amacımız kullanıcılar taskbar üzerinden bu iki resim arasında geçiş yapabilmelerini ve bu iki resmi sanki uygulamanın iki ayrı arayüzüymüş gibi görebilmelerini sağlamak.

[VB]

        If TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(Resim) Is Nothing Then

            Dim GenT = Resim.TransformToVisual(Application.Current.MainWindow)

            Dim Nokta As Point = GenT.Transform(New Point(0, 0))

            Dim Thumbnail As New TabbedThumbnail(Application.Current.MainWindow, Resim, New Vector(Nokta.X, Nokta.Y))

            Thumbnail.Tooltip = "Bu bir foto!"

            AddHandler Thumbnail.TabbedThumbnailActivated, AddressOf Thumbnail_TabbedThumbnailActivated

            TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(Thumbnail)

        End If

[C#]

            if (TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(Resim) == null) {

                var GenT = Resim.TransformToVisual(Application.Current.MainWindow);

                Point Nokta = GenT.Transform(new Point(0, 0));

                TabbedThumbnail Thumbnail = new TabbedThumbnail(Application.Current.MainWindow, Resim, new Vector(Nokta.X, Nokta.Y));

                Thumbnail.Tooltip = "Bu bir foto!";

                Thumbnail.TabbedThumbnailActivated += Thumbnail_TabbedThumbnailActivated;

                TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(Thumbnail);

            }

Kodumuz biraz karışık gibi gözükebilir fakat aslında epeyce basit. Gelin satır satır inceleyelim. İlk olarak IF içerisinde kontrol ettiğimiz noktadan bahsedelim. Bizim örneğimizde Resim nesnesi için Toolbar'da bir Thumbnail yaratacağız o nedenle daha önce yaratılıp yaratılmadığını kontrol etmekte fayda var. Kontrol işlemini GetThumbnailPreview metodu ile yapabiliyoruz. Eğer daha önce thumbnail yaratılmamış ise kodumuz çalışmaya devam edecek.

GenT ve Nokta değişkenlerimiz aracılığı ile aslında uygulama içerisinde Thumbnail olarak kullanacağımız elementin uygulama penceresine göre offsetini hesaplıyoruz. Bu bilgiyi bir Vector nesnesi olarak bir sonraki adımda TabbedThumbnail yaratırken kullanmak zorundayız. TabbedThumbnail nesnesi yaratmak aslında işlemin sonuna geldiğimizi de gösteriyor. Bu nesneyi yarattıktan sonra geriye bir tek onu taskbara eklemek kalıyor. TabbedThumbnail yaratırken parametre olarak uygulamamızın hangi penceresine eklediğimizi ve görsel nesnemizi (Resim) verirken son olarak da görsel nesnenin pencereye göre offsetini veriyoruz. TabbedThumbnail 'in isterseniz Tooltip ve Title özelliklerini de set ederek Taskbar'da gözükmelerini sağlayabilirsiniz.

Son adım yarattığımız TabbedThumbnail 'in kullanıcı tarafından seçildiğinde çalıştırılacak olan event-listener'ını eklemek. Bunun için TabbedThumbnail nesnesinin TabbedThumbnailActivated adında bir event'ı bulunuyor. Son olarak event bağlamasını da bitirdiğimize göre artık AddThumbnailPreview ile TabbedThumbnail 'imizi taskbara ekleyebiliriz.

Tek uygulama, taskbarda iki thumbnail!
Tek uygulama, taskbarda iki thumbnail!

Yukarıdaki şekli ile uygulamamızdaki iki farklı resim için de TabbedThumbnail yaratarak Taskbara'a ekledikten sonra tek yapmamız gereken her iki TabbedThumbnail'in de event listener'larında uygulama arayüzünde gerekli değişiklikleri yapmak. Aşağıda uygulamanın tam kodunu bulabilirsiniz.

Hepinize kolay gelsin.

[VB]

    Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded

        If TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(Resim) Is Nothing Then

            Dim GenT = Resim.TransformToVisual(Application.Current.MainWindow)

            Dim Nokta As Point = GenT.Transform(New Point(0, 0))

            Dim Thumbnail As New TabbedThumbnail(Application.Current.MainWindow, Resim, New Vector(Nokta.X, Nokta.Y))

            Thumbnail.Tooltip = "Bu bir foto!"

            AddHandler Thumbnail.TabbedThumbnailActivated, AddressOf Thumbnail_TabbedThumbnailActivated

            TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(Thumbnail)

        End If

        If TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(Resim2) Is Nothing Then

            Dim GenT = Resim.TransformToVisual(Application.Current.MainWindow)

            GenT = Resim2.TransformToVisual(Application.Current.MainWindow)

            Dim Nokta As Point = GenT.Transform(New Point(0, 0))

            Dim Thumbnail As New TabbedThumbnail(Application.Current.MainWindow, Resim2, New Vector(Nokta.X, Nokta.Y))

            Thumbnail.Tooltip = "Bu başka bir foto!"

            AddHandler Thumbnail.TabbedThumbnailActivated, AddressOf Thumbnail2_TabbedThumbnailActivated

            TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(Thumbnail)

        End If

    End Sub

 

    Private Sub Thumbnail_TabbedThumbnailActivated(ByVal sender As Object, ByVal e As Microsoft.WindowsAPICodePack.Taskbar.TabbedThumbnailEventArgs)

        Canvas.SetZIndex(Resim2, 10)

        Canvas.SetZIndex(Resim, 11)

    End Sub

 

    Private Sub Thumbnail2_TabbedThumbnailActivated(ByVal sender As Object, ByVal e As Microsoft.WindowsAPICodePack.Taskbar.TabbedThumbnailEventArgs)

        Canvas.SetZIndex(Resim, 10)

        Canvas.SetZIndex(Resim2, 11)

    End Sub

[C#]

        private void Window1_Loaded(object sender, RoutedEventArgs e)

        {

            if (TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(Resim) == null) {

                var GenT = Resim.TransformToVisual(Application.Current.MainWindow);

                Point Nokta = GenT.Transform(new Point(0, 0));

                TabbedThumbnail Thumbnail = new TabbedThumbnail(Application.Current.MainWindow, Resim, new Vector(Nokta.X, Nokta.Y));

                Thumbnail.Tooltip = "Bu bir foto!";

                Thumbnail.TabbedThumbnailActivated += Thumbnail_TabbedThumbnailActivated;

                TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(Thumbnail);

            }

            if (TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(Resim2) == null) {

                var GenT = Resim.TransformToVisual(Application.Current.MainWindow);

                GenT = Resim2.TransformToVisual(Application.Current.MainWindow);

                Point Nokta = GenT.Transform(new Point(0, 0));

                TabbedThumbnail Thumbnail = new TabbedThumbnail(Application.Current.MainWindow, Resim2, new Vector(Nokta.X, Nokta.Y));

                Thumbnail.Tooltip = "Bu başka bir foto!";

                Thumbnail.TabbedThumbnailActivated += Thumbnail2_TabbedThumbnailActivated;

                TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(Thumbnail);

            }

        }

 

        private void Thumbnail_TabbedThumbnailActivated(object sender, Microsoft.WindowsAPICodePack.Taskbar.TabbedThumbnailEventArgs e)

        {

            Canvas.SetZIndex(Resim2, 10);

            Canvas.SetZIndex(Resim, 11);

        }

 

        private void Thumbnail2_TabbedThumbnailActivated(object sender, Microsoft.WindowsAPICodePack.Taskbar.TabbedThumbnailEventArgs e)

        {

            Canvas.SetZIndex(Resim, 10);

            Canvas.SetZIndex(Resim2, 11);

        }

Örneklere ait kaynak kodlar.