Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Turhal Temizer
Turhal Temizer
http://www.turhaltemizer.com
İletişme geçmek için tıklayın.
92 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: Foundation Menu Presentation Slider Temizer Turhal Turhal Temizer Turhaltemizer Windows Presentation Foundation WPF WPF Menu WPF Slider .NET 3.x Turhal Temizer
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : .NET 3.x
Yayınlanma Tarihi : 8.11.2009
Okunma Sayısı : 23583
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 28.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 28.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 28.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 28.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
WPF - Slider ve Menu Kontrolleri
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Windows Presentation Foundation ile uygulama geliştirirken kullanabileceğimiz kontrol paleti işlerimizi rahatlıkla yürütebileceğimiz kadar geniştir. Araç kutusu içerisinde yer alan kontroller Framework sürümünü arttırdıkça ve codeplex, code.msdn gibi sitelerde yer alan projeler yardımı ile daha da artmaya devam etmektedir. WPF 'in grafiksel ve görsel gücüne günlük yaşantı da kullanılan kontrollerin de kullanılabilir olması sayesinde en basit uygulamalardan en karmaşık uygulamalara kadar geliştirilebilme olanağı tanınıyor.

Bu yazımızda WPF üzerinde kullanılan en temel kontrollerin Slider ve Menü kontrolünün özelliklerini inceliyor ve nasıl kullanıldığını, özellikleri incelemeye çalışıyor olacağız.

WPF - Slider Control
Slider kontrolü kullanımı en basit olan kontrollerden biridir. Temel olarak yaptığı işlem belirli aralıkta değerleri değiştirmek ve bu değişen değerleri başka bir kontrol ya da işlem ile ilişkilendirmektedir. Slider kontrolünün en önemli iki özelliği vardır. Bunlar başlangıç ve bitiş değerlerini belirten Max. ve Min. değerledir. Temel olarak Slider kontrolü kullanımı aşağıdaki gibi olacaktır.

Slider.xaml
<Slider Height="23" HorizontalAlignment="Left" Margin="26,34,0,0" Name="slider1" VerticalAlignment="Top" Width="250" Minimum="0" Maximum="100" />

Slider kontrolünün temel kullanımı yukarıdaki kod parçasında belirttiğimiz gibidir. Bu kullanım şekli dışında değinilebilecek pek özelliği yoktur. Bu sebeple kullanılabilecek örnekleri sizlere aktararak yazımıza devam edeceğiz.

Şöyle bir örnek hayal edelim. ProgressBar kontrolü ile Slider kontrolünü birlikte kullanabilmemiz mümkündür. Bunun için ProgressBar kontrolünün value özelliğine Slider değerini eklemek yeterli olacaktır. Peki yapmış olduğumuz bu işlem sonrasında ne gibi bir sonuç ile kaşılaşacağız. Biz slider kontrolü üzerindeki değerleri değiştirdikçe ProgressBar kontrolünün değerleri de değişiyor olacaktır.

Slider.xaml
<Window x:Class="WPFControls.Slider"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Slider" Height="300" Width="300">
    <Grid x:Name="LayoutRoot">
        <Slider RenderTransformOrigin="0.501,0.622" Margin="81,161.66,66,0"
            x:Name="Slider" Style="{DynamicResource SimpleSlider}"
            VerticalAlignment="Top" Height="22" Maximum="100" Minimum="0" Value="0" >
            <Slider.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="-1" ScaleY="-1"/>
                    <SkewTransform AngleX="0" AngleY="0"/>
                    <RotateTransform Angle="179.863"/>
                    <TranslateTransform X="-0.954" Y="-9.028"/>
                </TransformGroup>
            </Slider.RenderTransform>
            <Slider.Background>
                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FFFFFFFF" Offset="0"/>
                    <GradientStop Color="#FFF5A544" Offset="1"/>
                </LinearGradientBrush>
            </Slider.Background>
        </Slider>
        <ProgressBar Margin="80,119,63,0" Style="{DynamicResource SimpleProgressBar}" VerticalAlignment="Top" Height="20" Value="{Binding Path=Value, ElementName=Slider, Mode=Default}">
            <ProgressBar.Background>
                <LinearGradientBrush EndPoint="1,0" StartPoint="0,0">
                    <GradientStop Color="#FFBABABA" Offset="0"/>
                    <GradientStop Color="#FFC7C7C7" Offset="0.5"/>
                    <GradientStop Color="#FF5D9C1D" Offset="0.75"/>
                </LinearGradientBrush>
            </ProgressBar.Background>
        </ProgressBar>
    </Grid>
</Window>

Kontrolü çalıştırdığımızda aşağıdaki gibi bir ekran görüntüsü ile karşılaşırız.


Ayrıca sizler yukarıdaki kod blogunu kendi XAML dosyanıza eklediğiniz SimpleSlider kaynağını bulamıyorum şeklinde hata verecektir. Bu stil için oluşturulmuş olan bir kaynak dosyadır. Bu kaynak bilgisini kaldırmanız durumunda sorunsuzca çalışacaktır. Zaman içerisinde sizlere bütün Simple Style dosyasını veriyor olacağız. Kullanmak isteyenler için SimpleSlider kaynak stili aşağıdaki gibidir.

SimpleStyle.xaml
<Style x:Key="SimpleSlider" TargetType="{x:Type Slider}">
    <Setter Property="Background" Value="{DynamicResource LightBrush}"/>
        <Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Slider}">
                        <Grid x:Name="GridRoot">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
   
                            <!-- TickBar shows the ticks for Slider -->
                            <TickBar Visibility="Collapsed" x:Name="TopTick" Height="4" SnapsToDevicePixels="True" Placement="Top" Fill="{DynamicResource GlyphBrush}"/>
                                <Border Grid.Row="1" Margin="0" x:Name="Border" Height="4" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding                                     BorderThickness}" CornerRadius="2"/>

                                <!-- The Track lays out the repeat buttons and thumb -->
                                <Track Grid.Row="1" x:Name="PART_Track">
                                    <Track.Thumb>
                                        <Thumb Style="{DynamicResource SimpleSliderThumb}"/>
                                    </Track.Thumb>
                                    <Track.IncreaseRepeatButton>
                                        <RepeatButton Style="{DynamicResource SimpleScrollRepeatButtonStyle}" Command="Slider.IncreaseLarge"/>
                                    </Track.IncreaseRepeatButton>
                                        <Track.DecreaseRepeatButton>
                                            <RepeatButton Style="{DynamicResource SimpleScrollRepeatButtonStyle}" Command="Slider.DecreaseLarge"/>
                                        </Track.DecreaseRepeatButton>
                                </Track>

                            <TickBar Visibility="Collapsed" Grid.Row="2" x:Name="BottomTick" Height="4" SnapsToDevicePixels="True" Placement="Bottom" Fill="{TemplateBinding Foreground}"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="TickPlacement" Value="TopLeft">
                                <Setter Property="Visibility" Value="Visible" TargetName="TopTick"/>
                            </Trigger>
                            <Trigger Property="TickPlacement" Value="BottomRight">
                                <Setter Property="Visibility" Value="Visible" TargetName="BottomTick"/>
                            </Trigger>
                            <Trigger Property="TickPlacement" Value="Both">
                                <Setter Property="Visibility" Value="Visible" TargetName="TopTick"/>
                                <Setter Property="Visibility" Value="Visible" TargetName="BottomTick"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/>
                                <Setter Property="BorderBrush" Value="{DynamicResource DisabledBorderBrush}" TargetName="Border"/>
                            </Trigger>

                            <!-- Use a rotation to create a Vertical Slider form the default Horizontal -->
                            <Trigger Property="Orientation" Value="Vertical">
                                <Setter Property="LayoutTransform" TargetName="GridRoot">
                                    <Setter.Value>
                                        <RotateTransform Angle="-90"/>
                                    </Setter.Value>
                                </Setter>
                                <!-- Track rotates itself based on orientation so need to force it back -->
                                <Setter TargetName="PART_Track" Property="Orientation" Value="Horizontal"/>
                            </Trigger>

                        </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>

Hazırlayacak olduğumuz bir diğer örnek ise ekran üzerine eklemiş olduğumuz bir resmin boyutlarını büyültüp azaltmak olacaktır. Bu işlem için form üzerine slider kontrolü ile bir adet resim eklemek ve sonrasında slider üzerinde değişiklik olduğu zaman resmin boyutunu bizim belirlediğimiz boyutta değiştirmek olacaktır.

Slider.xaml
<Window x:Class="WPFControls.Slider"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Slider" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="200" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Rectangle Grid.Row="0" Grid.Column="0" Width="250">
            <Rectangle.Fill>
                <ImageBrush x:Name="imageBrush" ImageSource="Images/copy.png" />
            </Rectangle.Fill>
        </Rectangle>
        <Slider Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
            Value="1"
            Delay="100"
            Interval="5"
            TickPlacement="BottomRight"
            Minimum="1"
            Maximum="10"
            Width="100"
            AutoToolTipPlacement="BottomRight"
            ValueChanged="Slider_ValueChanged"
            Grid.Row="1"
            Grid.Column="0">
        </Slider>
    </Grid>
</Window>

XAML kodu yukarıdaki gibi düzenledikten sonra CS dosyasının içerisinde aşağıdaki değişiklikleri yapıyoruz.

Slider.xaml.cs
using System.Windows;
using System.Windows.Media;

namespace WPFControls
{
    /// <summary>
    /// Interaction logic for Slider.xaml
    /// </summary>
    public partial class Slider : Window
    {
        public Slider()
        {
            InitializeComponent();
        }

        private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            double value = e.NewValue;
            ImageBrush imageBrush = this.FindName("imageBrush") as ImageBrush;
            imageBrush.Viewbox = new Rect(0.3, 0.3, 1 / value, 1 / value);
        }
    }
}

Yapmış olduğumuz işlemler sonrasında ekran görüntüsü aşağıdaki biçimde olacaktır.



Sonuç olarak, bu kısımda web ve windows uygulamalarının kullanılması en kolay olan kontrollerinden Slider kontrolünü incelemeye çalıştık. En temel iki özelliğinin olduğunuda bunlarında max ve min değerleri olduğuna değindik. Ayrıca değinmiş olduğumuz bu özellikleri örnekler ile açıklayarak daha da anlaşılır olmasını sağlamaya çalıştık.
WPF - Menü Control
Menü kontrolü Windows Vista 'nın çıkışıyla birlikte menü kontrolünün kullanımı azalma eğlimine girmiş olsada hala çok sık olarak kullanılmaya devam etmektedir. Özellikle Ribbon menüye geçmemiş ya da geçmek istemeyen proje sahiplerinin projelerinde standart menü kontrolü kullanmak gerekebilir. Ayrıca görselliği kısmen bir yana bırakarak sadece yazı içerdiği içinde çok daha hızlı bir kullanım şekli sağlamaktadır. Ancak şuna da değinmeden geçemeyeceğim. Ribbon menünün yeri bambaşkadır. Neden derseniz, menü içerisinde yer alan metinlerin ne işe yaradığını görsel olarak ve kocaman kocaman ikonlar ile göstermek son kullanıcıları memnun eden yegane özelliklerdendir. Ancak biz şimdilik yine klasiklerde kalarak menü kontrolünü incelemeye başlayalım.

Not: Sizlere değinmek istediğim ufak bir konu var. Eğer ki WPF ya da denki bir uygulama geliştirmeyi düşünüyorsanız kesinlikle Visual Studio 2010 idesini denemenizi öneriyorum. Hem idenin WPF ile yeniden yazılmış olması hemde .Net 3.5.1 sürümünün desteğini tamamen arkasına almasından ötürü geliştirme performansı konusunda oldukça iyi çözümler bize sunabilmektedir. Ayrıca şu anda itibari Beta2 sürümü olması ve daha da gelişecek olacağını da düşünürsek WPF uygulamaları ya da diğer uygulamaları geliştirecek yazılımcılar için tercih edilmesi gereken öncelikli ide olacaktır.

Kullanmak için <Menu> kontrolünün içerisine <MenuItem> elemanlarına değerleri atamak yeterli olacaktır. Peki nasıl kullanıyoruz. Basitçe göz atalım.

Menu.xaml
<Menu IsMainMenu="True">
    <MenuItem Header="_Dosya" />
    <MenuItem Header="_Düzen" />
    <MenuItem Header="_Görünüm" />
    <MenuItem Header="_Pencere" />
    <MenuItem Header="_Yardım" />
</Menu>

ContextMenu kontrolünden alışık olduğumuz kullanma şekli ile menü kontrolünü oluşturmul olduk. ContextMenu kontrolün farkı ise, genel bir menü olmasıdır. Ekran görüntüsü aşağıdaki gibi olur. Hatırlayacağınız üzere ContextMenu kontrolünde herhangi bir kontrole özellik olarak eklenir ve sağ tıklama sonrasında karşımıza çıkar.



Menüyü oluştururken dikkat edeceğiniz üzere Header özelliklerine atamış olduğumuz değerlerde ile olarak "_" kullanılmıştır. Sebebi ise, klavye üzerinde F10 ya da alt tuşuna basıldığında tek tuş ile kullanım olanağı vermesi içindir.

ContextMenu kontrolünde menu elemanlarının içeriğine ikon ekleyebilmemiz mümkündü. Aynı şekilde klasik menü kontrolünde de bu özellik mevcuttur. Ayrıca yine aynı şekilde Command özelliğine vermiş olduğunuz parametreler ile hiç bir kod yazmadan kolayca işlemlerde yaptırabilmeniz mümkündür. Kısaca bu özellikleri açıklayan bir örnek hazırlayalım. Bu işlem için olarak oluşturmuş olduğumuz menü kontrolünün düzenle elamanının içerisine alt elemanlar olarak kes, kopyala ve yapıştır işlemlerini yapacak şekilde ekliyoruz.

Menu.xaml
<Menu IsMainMenu="True">
    <MenuItem Header="_Dosya" />
    <MenuItem Header="_Düzen">
        <MenuItem Header="_Kes" Command="Cut">
            <MenuItem.Icon>
                <Image Source="Images/cut.png" />
            </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_Kopyala" Command="Copy">
            <MenuItem.Icon>
                <Image Source="Images/copy.png" />
            </MenuItem.Icon>
        </MenuItem>
        <MenuItem Header="_Yapıştır" Command="Paste">
            <MenuItem.Icon>
                <Image Source="Images/paste.png" />
            </MenuItem.Icon>
        </MenuItem>
    </MenuItem>
    <MenuItem Header="_Görünüm" />
    <MenuItem Header="_Pencere" />
    <MenuItem Header="_Yardım" />
</Menu>

Yapmış olduğumuz değişiklik sonrasında ekran görüntüsü aşağıdaki gibi olacaktır.



Şu ana kadar herşey güzel gidiyor. Şimdi değineceğimiz özellik ise klasik menülerde en sık kullanılan özelliklerden biri olan seçilebilirlik. Ekran üzerinde bazı değerlerin gösterilmesi ya da gösterilmemesi için çok sık kullanılan bir özelliktir. Bu özelliğin aktifleştirilebilmesi için yapılması gereken tek işlem IsCheckable özelliğine True,False değerlerinden birini atamak olacaktır. Sonrasında istediğimiz işlemleri yapabilmemiz mümkün olacaktır.

Menu.xaml
<MenuItem Header="_Görünüm">
    <MenuItem Header="Düzenlenebilirlik" IsCheckable="True" />
</MenuItem>

Seçilebilir menüyü oluşturduk. Bakalım projeyi çalıştırdığımızda da düşündüğümüz sonucu alabilmiş miyiz?



Herşey yolunda gözüküyor. :) Menü kontollerinde ve web uygulamalarında en çok sevilen yardımcı kontrollerden biri de seperator kullanımıdır. Bir içerik hazırlanacak olduğunda küçük gruplara ayrılması istendiği durumlarda kullanımına gerek duyulmaktadır. Bu sebepten ötürüdür ki en sık menü kontrollerinde kullanılır. Peki, kullanımı için ne yapmak gerekir? <Seperator /> yazmak yeterli olacaktır.

Menu.xaml
<MenuItem Header="_Dosya">
    <MenuItem Header="_Yeni..." />
    <Separator />
    <MenuItem Header="_Aç..." />
    <Separator />
    <MenuItem Header="_Kaydet" />
    <MenuItem Header="_Farklı Kaydet..." />
    <Separator />
    <MenuItem Header="_Çıkış" />
</MenuItem>

Seperator kullanımı sonrasında ise menünün yenilenen içeriği aşağıdaki gibi olacaktır.



Menu kontrolü ile değineceğimiz son özellik ise, tıklanması anında yapılacak işlem olacaktır. Bu işlemi yapabilmek için alışık olduğumuz üzere click olayına kod tarafında istediğimiz işlemleri atamak yeterli olacaktır.

Menu.xaml
<MenuItem Header="_Yeni..." Click="Yeni_Click" />

Menu.xaml.cs
private void Yeni_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Menü içerisinden yeni 'ye tıkladınız. İşte size yeni :");
}

Çok basit olarak tıklanması esnasında neler yapılması gerektiğine de değinmeye çalıştık. Eğer ki bütün menü içeriğini kod içerisinde oluşturmak isterseniz, bir olaydan, koşuldan ya da aklımıza gelmeyen herhangi bir durumdan sonra kod yardımı ile Menu, MenuItem, MenuItemRoles sınıf ve enumlarını kullanarakta istediğiniz menüleri oluşturabilmeniz mümkündür. Bu da daha iş süreçlerini ve kurumsal projeleri etkileyen bir kullanım olacaktır.

Son olarak oluşturmuş olduğumuz menü kontrolünün bütün kodları şu şekilde olmuştur.

Menu.xaml
<Window x:Class="WPFControls.Menu"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="Menu" Height="300" Width="300">
    <Grid>
        <Menu IsMainMenu="True">
            <MenuItem Header="_Dosya">
                <MenuItem Header="_Yeni..." Click="Yeni_Click" />
                <Separator />
                <MenuItem Header="_Aç..." />
                <Separator />
                <MenuItem Header="_Kaydet" />
                <MenuItem Header="_Farklı Kaydet..." />
                <Separator />
                <MenuItem Header="_Çıkış" />
            </MenuItem>
            <MenuItem Header="_Düzen">
                <MenuItem Header="_Kes" Command="Cut">
                    <MenuItem.Icon>
                        <Image Source="Images/cut.png" />
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Kopyala" Command="Copy">
                    <MenuItem.Icon>
                        <Image Source="Images/copy.png" />
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Yapıştır" Command="Paste">
                    <MenuItem.Icon>
                        <Image Source="Images/paste.png" />
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>
            <MenuItem Header="_Görünüm">
                <MenuItem Header="Düzenlenebilirlik" IsCheckable="True" />
            </MenuItem>
            <MenuItem Header="_Pencere" />
            <MenuItem Header="_Yardım" />
        </Menu>
    </Grid>
</Window>

Sonuç olarak gördüğünüz üzere kolayca menü kontrollerini kullanabiliyoruz. WPF uygulamalarında klasik menü kullanmak istediğimiz durumlarda, ister XAML kod yardımı ile istersekte CS kod yardımı ile çok basit ancak hızlı menüler oluşturabilmemiz mümkündür.

Umarım yararlı olabilmiştir.

Turhal Temizer
[email protected]
http://turhal.blogspot.com
Makale:
WPF - Slider ve Menu Kontrolleri .NET 3.0 ve .NET 3.5 Özel Bölümü Turhal Temizer
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor