WPF - Text & Flow Document

Metinler hazırladığımız uygulamaların vazgeçilmezledir. Windows Presentation Foundation ile metin iÅŸlemlerini kullanırken bir çok özelliÄŸi kolaylıkla kullanmamıza olanak tanınmaktadır. WPF, metin görüntülenmesine olanak tanınan her yerde yazılarımızı görüntülememize olanak tanımaktadır. Basit metin formatlarından çok daha karışık formatlara ve istediÄŸimiz biçimde stillendirdiÄŸimiz metinlere kadar çok geniÅŸ bir yelpaze WPF ile sunulmaktadır. Metinleri kullanırken yalnızca yazılarla kalmayıp kullanıcı kontrollerini, grafiklerini de kullanabilmemiz mümkündür. Metin iÅŸlemlerinde en göze çarpan ve yapılması istenen bir diÄŸer özellik ise tip kontrolleridir. WPF‘ te bu iÅŸlemler içinde Typography sınıfı kullanılmaktadır. Ayrıca oluÅŸturduÄŸumuz olan metinlerin uygulamamızda daha derli toplu görülebilmesi için Flow Document ( akan belgeler ) ve Fixed Document ( deÄŸiÅŸmez belgeler ) sınıfları kullanılmaktadır. Bu sınıfların kontrollerini kullandığımız zaman ise bizlere birçok kontrolü içinde barındıran kontrol sunulmaktadır. Biz bu makalemize süresinde yukarıda bahsettiÄŸimiz bütün özellikleri incelemeye çalışacağız. Ä°lk olarak incelemeye baÅŸlamadan önce Flow Document kullanılan birkaç uygulamadan örnek olacak.

Türkiye’ de ve bütün dünyada Windows Presentation Foundation tanıtımları yapılırken gösterilen ortak bir uygulama vardı. Demoda bir gazetenin internete baÅŸlanmadan videoları, resimleri ve içerikleri ile birlikte bilgisayarda kullanılmasına olanak tanıyan bir örnekti. Gösterilen demo New York Times Reader ‘dır. Uygulamada, yazılar belirli ölçülerde büyültülüp küçültülürken sayfalamalar ona göre otomatik olarak ÅŸekillendiriliyor, düzenli olarak güncelleme alabiliyor ve hem hızlı hem de görsel olarak son kullanıcının hoÅŸuna gidecek animasyonlar sunuyordu. Kısacası geliÅŸtiriciler ve kullanıcılar bu uygulamayı fazlasıyla beÄŸenmekteydi. Åžimdi bu uygulama ve bu uygulama esas alınarak hazırlanan baÅŸka bir uygulamanın ekran görüntülerini aÅŸağıda göreceksiniz. Bu uygulamaların ortak yanları;

Windows Presentation Foundation ile yapılmış olmaları,
Flow Document kontrolünün kullanılmış olması,
İçeriklerinin web servisler ile otomatik olarak çekiliyor olması,
Arama için gerekli olan sorgularında LinQ To SQL kullanmaları,
Sayfa geçişlerinde ve arama işlemleri sonuçlarında animasyon kullanılması,
biçiminde sıralayabilmemiz mümkündür.


New York Times Reader


MSDN Libary

Yukarıda ekran görüntülerini gördüğünüz uygulamaların en belirgin özellikleri içeriklerinden bulunan metinlerin uygulamanın boyutuna göre kendisini otomatik olarak şekillendirmesidir.

Artık temel olarak metin ve flow document ile neler yapabileceğimize göz attığımıza göre bizlerde bu tür uygulamalar geliştirmek istediğimizde kullanabileceğimiz metin özelliklerini incelemeye başlayabiliriz.

Yazı Tipi ve Metin Stilleri

Metin ile ilgili işlemler ile uğraştığımızda bir çok aşamayı başarılı bir biçimde yapabilmemiz gerekmektedir. Fakat WPF ile sağlanan kolaylıklar ve bünyesinde barındırdığı bir çok yazı tipi stilleri sayesinde daha kolaylıkla yapabilmemiz mümkündür. Metin uygulamalarında altı çizili olması, kalın olması, eğik olması, farklı yazı tiplerinin kullanılabilmesi, boyutlarının kolaylıkla değiştirilebilmesi ve işletim sistemlerinin temalarından doğan sorunların oluşmaması gibi bir çok faktörü düşünerek hareket ederiz. WPF ile ise bahsettiğimiz bir çok faktörü HTML ile kod yazarken yaşadığımız kolaylık ile uygulayabiliyoruz.

Yaygın Metin Özellikleri

WPF ile hazırlamış olduğumuz uygulamalarda metinleri belirlediğimiz zaman TextElement sınıfını çağırmamız gerekmektedir. TextElement sınıfına dahil edilmiş birçok özelliği kullanarak en yaygın olarak kullanılan metin işlemlerini yapabilmemiz mümkündür. Şimdi bu sınıfı buton kontrolünün içerisinde nasıl kullanabileceğimizi basit bir örnek ile inceleyelim.

XAML Kod
<Button TextElement.FontFamily="Parchment" TextElement.FontSize="80" Height="96" VerticalAlignment="Top">
    Turhal Temizer
</Button>
<Button FontFamily="Parchment" FontSize="80" Height="96" VerticalAlignment="Bottom">
    Duygu Çaglar
</Button>

XAML koddan dikkat edeceğiniz üzere TextElement sınıfı ile metin özelliklerine belirleyebilirken aynı zamanda direk yapmak istediğimiz metinsel değişikleri belirterek de yapabilmemiz mümkündür. İkisi arasında bir fark yoktur ve özellikler penceresinde yaptığımız işlemlerin sonucunun sorunsuz olduğunu görebiliriz.



Butonumuzun görüntüsünün nasıl gözüktüğüne görmek gerekirse,



iki butonda da belirttiğimiz yazı tipi ve boyutu sorunsuz bir biçimde uygulanmış olduğu görülür.
Text Element miraslaşarak oluşturulan özellikleri ve ne işe yaradıklarını aşağıdaki gibi listeleyebiliriz.



Özellik Kullanımı
FontFamily
Yazı biçimini belirler(Arial, Calibri, v.b.).
FontSize Yazıların boyutlarını belirler. (XAML‘ de kullanabileceÄŸimiz boyut standartları: in, cm, px, pt ‘dir. Bu kısaltmalar ayrıntılı olarak inç, santimetre, piksel, nokta.) EÄŸer herhangi bir standart girilmezse varsayılan olarak piksel kabul edilir.
FontStretch Yazının gerginliğini belirler. Condensed, Normal ve Expanded değerlerini alır.
FontStyle Yazınını stilini belirler. Italic ve Normal değerlerini alır.
FontWeight Yazını genişliğini belirler. Normal, Bold ve Light değerlerini alır.
Foreground Yazının rengini belirler.

Daha öncede bahsettiğimiz gibi yukarıdaki özellikler kullanıcı kontrollerinde dahili olarak kullanılmaktadır ve TextElement sınıfının tekrardan çağırılmasına gerek yoktur.

Yazı ve Yazı Ailesi

Ortak kullanılan (FontFamily) yazı ailelerine ve tiplerine yer verilmiştir. Fakat FontFamily sınıfı kullanabileceklerimizden yalnızca biridir. WPF uygulamalarında sıklıkla kullanılan üç sınıfı ve kullanım biçimlerine ilişkin bilgiler aşağıdaki tablodadır.

Sınıf Kullanımı
FontFamily Yazı tiplerini isimleri ile temsil eder. Arial, Calibri, Times New Roman v.b. yazı tipleri kullanılabilmektedir.
GlypTypeface Diskimizdeki yazı tipini kullanır. C:\Windows\Fonts\timesbi.ttf gibi. Belirtilen yazı dosyasının içerisinden yazıya ilişkin stil, boyut ve diğer özellikleri bulunmaktadır. Yolunu verdiğimizde ise kalın, yassı ve stili Times New Roman dır.
Typeface FontFamily özelliklerini kullanır. GlypTypeface ile oluşturulan görüntülenmeler Typeface ile tekrardan görüntülenebilir.

Windows Presentation uygulamaları geliÅŸtirilirken sıklıkla kullanılan yazı ailesi FontFamily ‘dir. DiÄŸer iki yazı ailesi ise genellikle tasarımcılar tarafından özelleÅŸtirilen yazı stillerinin kullanılması durumunda kullanılmaktadır. Fakat kullanım sıklığı ve kolaylığı göz önüne alındığında FontFamily ‘nin daha fazla kullanıldığı gözlenir.

Yazı Boyutu (FontSize)

Metin işlemlerinde kullanacak olduğumuz yazının boyutunu istediğimiz biçimde şekillendirmemize olanak tanır. Hangi değerler ile boyutlarını yaygın metin özellikleri başlığının altındaki tabloda incelemiştik. Şimdi bu değerleri nasıl kullanabileceğimize XAML kod ile göz atalım.

XAML kod
<StackPanel>
    <TextBlock FontSize="40 px" Text="30 piksel"/>
    <TextBlock FontSize="40 pt" Text="30 nokta"/>
    <TextBlock FontSize="1.3 cm" Text="1.3 santimetre"/>
    <TextBlock FontSize="0.4 in" Text="0.3 inç"/>
</StackPanel>



Gerginlik (Stretch)

Metin uygulamalarında yer alan yazıların ekrandaki gerginliklerini belirlenmesine yarar. Kullanılan değerler FontStretches sınıfından çekilir. Bu değerler: UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, Normal, Medium, SemiExpanded, Expanded, ExtraExpanded ve UltraExpanded dir.

Sıklıkla kullanılan yazı stillerinde gerginlik deÄŸeri olarak normal kullanılmaktadır. EÄŸer ki diÄŸer özellikler kullanılırsa yatay olarak harfler ve rakamlar birbirlerine çok yaklaÅŸacak ve okuma güçlüğüne sebep olacaktır. Örnek olarak MS Office ‘de yer alan yazı tiplerinden Gill Sans MT‘ yi deneye bilirsiniz. Harflerin birbirine yakın olmasından dolayı okunma oldukça zordur.

Stil (Style)

FontStyle özelliÄŸi ile kullanılmaktadır. KullanabileceÄŸimiz deÄŸerleri: Normal, Italic ve Oblique ‘dir. Metinlerde farklı gösterilmesi düşünülen kelimelerde uygulanır. Arial yazı ailesi ile yazmış olduÄŸumuz bir yazıya stilleri uyguladığımızda oluÅŸan sonuç aÅŸağıdaki gibidir.



Weight

FontWeight özelliği metin uygulamalarındaki yazılarımızın daha koyu bir biçimde görülmesini sağlar. FontWeight sınıfında birçok değer kullanılmaktadır. Bunlar: ExtraLight/UltraLight, Light, Normal/Regular, Medium, DemiBold / SemiBold, Bold, ExtraBold / UltraBold, Black / Heavy ve ExtraBlack / UltraHeavy dir.

TextElement sınıfında kullanılmakla birlikte paragraf veya blok yazı alanlarında da kullanılması mümkündür. Metin belgelerinde genellikle önem sarf eden veya başlık olacak olan yazılarda sıklıkla kullanılmaktadır.

Decoration (Süsleme)

Decoration özelliği yazıların altını veya üzerine düz bir çizgi çizmeye yaramaktadır. Genellikle TextBlock içerisinde kullanılmaktadır. Ayrıca TextDecorations ile düz siyah çizgi çizmenin dışında belirli ölçülerde özelleştirebildiğimiz düzlemlerde çizilebilmektedir. Örnek vermek gerekirse;

<TextBlock TextWrapping="Wrap" TextAlignment="Center" FontSize="18">
    <Span TextDecorations="Underline">Turhal Temizer, </Span>
    <Span TextDecorations="Baseline"> Duygu ÇaÄŸlar, </Span>
    <Span TextDecorations="Strikethrough">Gövdesinde, </Span>
    <Span TextDecorations="Overline">Ãœzerinde, </Span>
    <Span TextDecorations="Underline, Baseline, Strikethrough, Overline">Hepsi</Span>
</TextBlock>
 

Şimdi ki örneğimizde ise standart siyah çizgini yerine mavi renkli kalın bir çizgiyi nasıl oluşturabileceğimize göz atacağız.

<TextBlock Margin="0,74,0,-74" FontSize="38" TextAlignment="Center">
    <Span>
        <Span.TextDecorations >
            <TextDecoration Location="Underline" PenOffset="4">
                <TextDecoration.Pen>
                    <Pen Brush="Blue" Thickness="1"/>
                </TextDecoration.Pen>
            </TextDecoration>
            <TextDecoration Location="Strikethrough">
                <TextDecoration.Pen>
                    <Pen Brush="LightGreen" Thickness="1"/>
                </TextDecoration.Pen>
            </TextDecoration>
        </Span.TextDecorations>
        Turhal Temizer
    </Span>
</TextBlock>



Windows Presentation Foundation da TextDecoration işlemlerini XAML kod yardımı ile ne kadar kolay yapabileceğimizi öğrenmiş olduk.

Text Wrapping & Hyphenation ( Metin aktarma ve Kesikli çizgi )

Son kullanıcılara sunulan uygulamalarda genellikle doldurmalı alanlar kullanıcılar tarafından uygulama alanının geniÅŸliÄŸinden daha fazla yer kullanarak taÅŸmasına sebep olmaktadır. Bu tür sorunları ortadan kaldırmak için kullanıcıya sunulan kontrolün geniÅŸliÄŸi tamamlandı ise bir alt satıra geçirilmesi için ufak ayarlamalar yapılırdı. WPF ‘de bu iÅŸlemleri iki biçimde yapabilmemiz mümkündür. Bunlardan birincisi TextWrapping ‘tir.

TextWrapping özelliği yazı yazdırılan satır dolmuş ise bir alt satıra geçmesine olanak tanımaktadır. Örnekler ile bu özelliği incelemek çok daha yararlı olacaktır.

TextWrapping özelliğini kullanmadan,

<TextBlock TextWrapping="NoWrap" Text="Turhal Temizer, Istatistik ve Bilgisayar Bilimleri, Karadeniz Teknik Universitesi"/>



TextWrapping özelliğini kullanarak,

<TextBlock TextWrapping="Wrap" Text="Turhal Temizer, Istatistik ve Bilgisayar Bilimleri, Karadeniz Teknik Universitesi"/>



TextWrapping özelliÄŸinin üçüncü deÄŸeri ise WrapWithOverflow ‘dur. Bu deÄŸer daha çok geniÅŸ boyutlu uygulamalarda Wrap ‘a göre daha iyi performans vermektedir.

TextWrapping özelliÄŸi ile birlikte kullanabileceÄŸimiz Hyphenation özelliÄŸi kelimeleri satıra sığabilecek kadar uzatır ve sığmayan kısmına kesikli çizgi “-” koyarak bir alt satırda kaldığı yerden devam etmektedir. Örnek olarak göstermek gerekirse,

<TextBlock TextWrapping="Wrap" IsHyphenationEnabled="True" Text="TextWrapping özelliği kullanabileceğimiz Hyphenation ..."/>



Text Alignment ( Metin Hizalaması )

Yazıların saÄŸa sola, ortaya veya her iki yana yaslı olarak yazılmasına olanak tanınmaktadır. Bu iÅŸlemin gerçekleÅŸebilmesi için TextAlignment özelliÄŸine right, left, justify ve center özelliklerinden herhangi birinin girilmesi yeterlidir. ÖzelliÄŸin uygulamalarını sıklıkla MS Office ‘te görebiliriz. Ä°lk açılan belge saÄŸa yaslı olarak yazmaya baÅŸlarken biz onu sayfanın istediÄŸimiz yerinde baÅŸlamasına olanak saÄŸlarız.

Metin ve Kullanıcı Arayüzü

WPF uygulamalarında tasarım mimarisi kullanıcı kontrollerinin kullanımı üzerine kurulmuştur. Hiyerarşinin gerçekleşmesinden kullanılan sınıflardan biri Glyph sınıfıdır. System.Windows.Forms.Design.Behavior isim alanından miraslaşarak oluşturulmuştur. Kullanılan kontrollerin form üzerinde gösterdiği özelliklere göre düzenlenmiştir. Hiyerarşinin en üst kademelerinden birinde yer alan Glyph sınıfı ile birlikte GlyphRunDrawing sınıfı kullanılmaktadır. System.Windows.Media isim alanından miraslaşmıştır. Kullanılan sınıfların modellenmesi ile metin işlemlerinde kullanabileceğimiz TextBlock ve FlowDocumentReader kullanıcı kontrolleri bizlere sunulmuştur. Şimdi sıklıkla kullanılan metin kontrollerini incelemeye çalışalım.

TextBlock

TextBlock kontrolü genellikle basit metinlerin görüntülenmesinde kullanılmaktadır. Birkaç kelimelik cümlelerin yazımında yazı stillerinin özelleştirilmesi gibi özellikleri kullanabilmemiz mümkündür. Basit olarak TextBlock kontrolünün nasıl kullanacağını gösterirsek,

<TextBlock Text="Turhal Temizer"/>

XAML kod bloğu biçimindedir. TextBlock kontrolünün form üzerinde nerede duracağı FrameworkElement yardımı ile belirtilebilmektedir. Ayrıca WPF formda Grid alanı yerine StackPanel kullanırsak ta kullanmış olduğumuz yazılar ve kontroller biz aksini belirtmediğimiz sürece alt alta dizilecektir.

TextBlock ‘ta çoklu satırda kullanılabilmektedir. Fakat kullanımı için doÄŸru karakterleri kullanabilmesi gerekmektedir. .Net ‘te Environment.NewLine özellikleri yardımı ile kullanılması mümkündür. Karakterler kullanılarak hazırlanmış TextBlock kontrol örneÄŸi aÅŸağıdadır.

<TextBlock Text="Turhal&#x0a; Temizer" />

&#x0a; kullanıldığı taktirde bitiminden sonraki kelimenin bir alt satırdan başlamasını sağlamaktadır.

TextBlock kontrolleri kullanılırken yazı ailesi ve stillerde kullanılabilmektedir. Ayrıca içerik olarak belirttiğimiz metinleri <TextBlock> tagları arasında kullanabilmemiz mümkündür.

<TextBlock>Turhal Temizer</TextBlock>

Metinlerde öncelikli olarak göstermemiz gereken kelimeleri kalın olarak göstermek isteyebiliriz. Bunun için yapmamız gereken HTML kodda olduÄŸu gibi Bold tagını kullanmak olacaktır (HTML ‘de bold tagı strong biçiminde kullanılmaktadır).

<TextBlock><Bold>Turhal Temizer</Bold></TextBlock>



Metin modellerinde kullanabileceğimiz stilleri yukarıda ayrıntılı bir biçimde açıklamıştık. Bahsettiğimiz özelliklerin hepsi TextBlock modeli içerisinde kullanılabilmektedir.

Label ve AccessText

Label, etiket olarak göstermek istediÄŸimiz metinlerde sıklıkla kullanılmaktadır. Özellikle Windows Form ‘larda kullanıcı tarafından deÄŸiÅŸtirilmesini istemediÄŸimiz metinleri kullanırken en sık tercih edilen kontroldü. Aynı ÅŸekilde bu kontrol TextBlock ile birlikte WPF form uygulamalarında da yerini almıştır. Fakat en belirgin farkı istediÄŸimiz bir harfi klavyeden alt karakterine bastığımızda altı çizili olarak gösterebilmemizdir. Bu kullanım ÅŸeklini Windows Form ile yapmak istediÄŸimizde kullandığımız karakterlerin hepsini ekranda göstermektedir. Altı çizili olarak gösterebilmek için istediÄŸimiz bir harfin önüne “-” karakterini koymamız yeterli olacaktır.

<Label FontSize="20" Content="D_uygu Çağlar Label"/>

Label gibi kullanacağımız bir diÄŸer kontrolde AccessText ‘tir. Bu kontrolde label gibi çalışmakla birlikte ilk kullanışta göze çarpan ilk farkı WPF formun en köşe noktasından baÅŸlıyor oluÅŸudur. Label kontrolü en köşe noktadan bir boÅŸluk mesafede metinleri göstermektedir. Kullanımda olmasa da metinleri girerken XAML kod tarafında ufak bir deÄŸiÅŸiklik ile metinleri girmek gerekmektedir. Label kontrolünden metinleri Content özelliÄŸi ile girerken AccessText kontrolü ile Text özelliÄŸi ile girmemiz gerekmektedir.

<AccessText Text="T_urhal Temizer AccessText"/>

İki kontrolün klavyeden alt karakterine basılması sonucunda aldığı ekran görüntüsü aşağıdaki gibi olacaktır.



FlowDocument

Flow Document kontrolü WPF ile gelen en büyük yeniliklerden biridir. Biraz önce bahsettiğimiz metin girme kontrolleri temel olarak uzun olmayan metinlerin girilmesinde kullanılmaktadır. Fakat paragraflarca metinlerin uygulamamıza eklenmesini istediğimizde o kontroller yeteri verimi verememektedir. Bu durumda bizlerin yapması gereken satır sonlarına geldiğinde düzenli olarak bir alt satıra geç, kullanıcı yazıyı büyütmek ve küçültmek istediğinde olabilmesi için kontroller yaz ve bunun gibi daha birçok işlemi yapmamız gerekmekteydi. Bunun yerine FlowDocument kontrolü kullanarak daha uygulamanın temellerinden karşılaşacağımız bir çok sorunu halletmiş oluruz.

Ayrıca ufak bir noktaya deÄŸinmek gerekirse, WPF form ile hazırlanmış uygulamalarda içerikleri gösterirken verilerin XML ile birlikte XPS (XML Paper Specifition) belgelerden çekildiÄŸinden de bahsedilmektedir. Peki bu XPS doküman nedir? Åžubat ayı itibari ile deÄŸiÅŸtirilemez doküman kategorisinde PDF ‘in yerine standart olarak kabul edilmiÅŸ bir belge türüdür. Kabul esnasında PDF ‘in kabul oranına nazaran çok daha yüksek bir oranla kabul edilmiÅŸtir. Belgeleri göstermek için internet tarayıcıları kullanmakta ve kullanımında kullanıcılara sunduÄŸu iÅŸlemleri Flow Document ile gerçekleÅŸtirmektedir. Ayrıca Windows Vista ile hazırlanan belgeler XPS ile ve bu iÅŸletim sisteminin çıkması ile yaygınlaÅŸmıştır. Microsoft ürünü olmakla birlikte diÄŸer yazılım ve biliÅŸim firmalarının da istediÄŸi bir belge standardıdır. Yalnızca lisans alım aÅŸamasında Microsoft ‘un diÄŸer firmalardan daha aktif davranmasından ötürü kendi bünyesine dahil etmedir.

XPS kullanımı esnasında API olarak System.IO.Packaging dönüşümünü kullanmaktadır. Daha ayrıntılı bilgi edinmek için ise http://www.microsoft.com/xps adresinden yararlanabilirsiniz.

FlowDocument oluştururken nasıl bir yol izlememiz gerektiğini örnek üzerinden anlatacağız. Bu işlem için <FlowDocument> kontrolü ve her paragraf için <Paragraph> üyesini kullanmamız gerekecektir.

<FlowDocument>
    <Paragraph FontSize="22">Text ile FlowDocument</Paragraph>
    <Paragraph FontSize="30">Flow Document</Paragraph>
    <Paragraph>Flow Document kontolü WPF ile …. </Paragraph>
    <Paragraph>…</Paragraph>
    <Paragraph>..</Paragraph>
</FlowDocument>



Flow Document kontrolünü kullanarak aramadan, boyut arttırmaya kadar birçok işlemi bir arada yapmamıza olanak tanınmaktadır. Bu işlemler esnasında yazı stillerinden sağa ve sola dayalı olması yazılar büyüdüğünde formumuza göre otomatik olarak şekillendirilmesi gibi bir çok özelliği otomatik olarak yapmaktadır.



Flow Document ile kullanabileceğimiz blokları aşağıdaki gibi listeleye biliriz.

Blok Kullanımı
Paragraph XAML kod bloğundan FlowDocument kontrolüne metin eklememize olanak tanır. Eklemiş olduğumuz metinler basit metinler olmalıdır. Sınırsız sayıda kullanılabilir. Diğer bloklar ile iç içe kullanılabilmektedir.
Section Diğer bloklara çeşitli özellikler atanmasına yarar. Diğer bloklara belirginlik, arka plan, yazı rengi ve buna benzer özellikleri belirlenmesinde yarar. Taglar içerisinde yazı metin yazılamaz. Paragraph gibi metin bloklarını kapsayacak biçimde tanımlanabilir.
List Listeleme yapılması için sıralı numara, roma rakamı, kalın nokta gibi standart listeleme simgelerinin kullanılmasına olanak tanır.
Table Belgelerde tablo ile gösterime ihtiyaç duyulduğunda kullanılmaktadır.
BlockUIContainer FlowDocument içerisine son kullanıcılara hitaben resim, video, buton ve üç boyutlu nesneler eklenmesine olanak tanır.

FlowDocument içerisinde kullanılabilecek blokların hepsinin ortak biçimde kullanıldığı bir örnek hazırlayalım. Örneğimizde başlığın arka plan rengi, listeli metin, BlockUIContainer ve tablo bulunacaktır.



XAML kod
<Window x:Class="mak43.Window8"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Flow Document">
    <!--Kapsamlı örnek-->
    <FlowDocument>
        <Section LineHeight="2" Foreground="White" Background="Black">
            <Paragraph FontSize="22">Windows Presentation Foundation</Paragraph>
            <Paragraph FontSize="30">Kısa Açıklamalar</Paragraph>
        </Section>
    <Paragraph>WPF: Ön plana çıkan özellikleri</Paragraph>
        <List>
            <ListItem>
                <Paragraph>Uygulama ile uyumu</Paragraph>
            </ListItem>
            <ListItem>
                <Paragraph>Çözünürlüğe bağımlılığı</Paragraph>
            </ListItem>
            <ListItem>
                <Paragraph>Donanımlar ile uyumu</Paragraph>
            </ListItem>
            <ListItem>
                <Paragraph>Bildirimli programlama</Paragraph>
            </ListItem>
            <ListItem>
                <Paragraph>ÖzelleÅŸtirelebilir zengin kontroller</Paragraph>
            </ListItem>
        </List>
        <BlockUIContainer>
            <Viewbox>
                <StackPanel Orientation="Horizontal">
                    <Image Source="yapi.jpg" Margin="5"/>
                    <TextBlock VerticalAlignment="Center" Width="100" TextWrapping="Wrap">
                        .Net Framework 3.0 teknolojisinden bulunanlar.
                    </TextBlock>
                </StackPanel>
            </Viewbox>
        </BlockUIContainer>
        <Paragraph>
            .Net 3.0 yapısının tablo ile gösterimi
        </Paragraph>
        <Table CellSpacing="5" Padding="15" FontFamily="Segoe UI">
            <Table.Background>
                <LinearGradientBrush>
                    <GradientStop Color="Yellow" Offset="0"/>
                    <GradientStop Color="Orange" Offset="1"/>
                </LinearGradientBrush>
            </Table.Background>
            <!-- dört sütün oluÅŸturuluyor: -->
            <Table.Columns>
            <TableColumn/>
            <TableColumn/>
            <TableColumn/>
            <TableColumn/>
            </Table.Columns>
            <!-- üç satır oluÅŸturuluyor: -->
            <TableRowGroup>
                <TableRow>
                    <TableCell ColumnSpan= "4" TextAlignment="Center">
                        <Paragraph FontWeight="Bold">.NET Framework 3.0</Paragraph>
                    </TableCell>
                </TableRow>
                <TableRow>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center" LineHeight="70">
                        <Paragraph FontWeight="Bold">WPF</Paragraph>
                    </TableCell>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">WCF</Paragraph>
                    </TableCell>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">WF</Paragraph>
                    </TableCell>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">WCS</Paragraph>
                    </TableCell>
                </TableRow>
                <TableRow>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">ADO.NET</Paragraph>
                    </TableCell>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">ASP.NET
                        </Paragraph>
                    </TableCell>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">Windows Forms</Paragraph>
                    </TableCell>
                    <TableCell BorderBrush="Black" BorderThickness="2" Background="LightGray"
                        TextAlignment="Center">
                        <Paragraph FontWeight="Bold">...</Paragraph>
                    </TableCell>
                </TableRow>
            </TableRowGroup>
        </Table>
    </FlowDocument>
</Window>

Oluşturmuş olduğumuz uygulamanın boyutlarını değiştirdiğimiz taktirde uygulamamızın içerisinde yer alan metinlerde otomatik olarak şekillenecektir.

Span

Yazı stillerinde anlatırken altı çizili, kalın, yassı yazıların nasıl oluşturulacağından ayrıntılı bir biçimde değinmiştik. FlowDocument ile bu özellikler kullanılmak istendiğinde nasıl bir kullanım izleneceğine değinmeye çalışalım. Yazı ile anlatırken TextBlock kontrolü içerisinde nasıl kullanılacağından değinmeye çalışmıştık. Şimdi ise Paragraph bloğu arasında kullanacağız.

XAML Kod
<FlowDocument>
    <Paragraph>
        <Bold>Kalın</Bold>
        <Italic>Yassı</Italic>
        <Underline>Altında</Underline>
        <Hyperlink>Link</Hyperlink>
        <Span BaselineAlignment="Superscript">SıuperScript</Span>
        <Span BaselineAlignment="Subscript">SubScript</Span>
        <Span>
            <Span.TextDecorations>
                <TextDecoration Location="Strikethrough"/>
            </Span.TextDecorations>
            Strikethrought
        </Span>
    </Paragraph>
    <Paragraph>
    a
    <Bold>b
        <Italic>c
            <Underline>d
                <Hyperlink>e</Hyperlink>
            f</Underline>
        g</Italic>
    h
    </Bold>
    i
    </Paragraph>
</FlowDocument>



Sabit Bloklar

FlowDocument içerisine yerleştirmiş olduğumuz resim, videoların blok içerisinden nerede duracağını belirlememize olanak tanırlar. Sayfanın boyutunun değişmesi sonucunda oluşan görüntü bozukluklarını ortadan amaçlar. Ufak bir örnek ile nasıl kullanıldığına göz atalım.

<FlowDocument>
    <Paragraph FontSize="22">Windows Client</Paragraph>
    <Paragraph FontSize="30">WPF 'in Form Dünyasındaki Yeri</Paragraph>
    <Paragraph>
        <Figure Width="130">
            <BlockUIContainer>
                <Image Source="Turhal11.jpg"/>
            </BlockUIContainer>
        </Figure>
        Windows Presentation Foundation …
    </Paragraph>
    <Paragraph>Windows Form …</Paragraph>
    <Paragraph>…</Paragraph>
    <Paragraph>…</Paragraph>
    <Paragraph>…</Paragraph>
    <Paragraph>
        Tabii bu yalnızca bir görüş. Bize doÄŸrusunu zaman gösterecektir.
    </Paragraph>
    <Paragraph>
        <Bold>Turhal Temizer</Bold>
    </Paragraph>
</FlowDocument>



FlowDocument ‘e eklemiÅŸ olduÄŸumuz resim varsayılan olarak formun ilk sütununun saÄŸ köşesine eklenmiÅŸtir. EÄŸer biz resmin yerine deÄŸiÅŸtirmek istiyorsak yapmamız gereken VerticakAnchor ve HorizontalAnchor deÄŸerlerini belirlemek olacaktır. Örnekler ile sonuçlarına göz atalım.


HorizontalAnchor="ColumnLeft"


HorizontalAnchor="PageCenter"


HorizontalAnchor="PageRight" ve VerticalAnchor="PageTop"

FlowDocument Görüntüleme

FlowDocument ile açıklamaları anlatırken hazır kontrolün özelliklerini kısıtlayabileceğimizden de bahsetmiştik. Uygumalarımızın sağ alt köşesinde görüntüleme ile ilgili üç adet seçenek çıkmaktadır. Eğer geliştiriciler isterse bu üç kontrolden herhangi birini XAML kod bloğunda FlowDocument tagından önce yazarak varsayılan olarak uygulatabiliriz ve değiştirilmesini engelleyebiliriz.

Görüntüleme ile ilgili üç seçeneğin ne işe yaradığını aşağıdaki tabloda ayrıntılı bir biçimde öğrenebilirisiniz.

Görütüleme Görevi
FlowDocumentScrollViewer Belgelerin web sayfalarında veya MS Word ‘de olduÄŸu gibi aÅŸağı yukarı kaydırma çubuÄŸu ile hareketlenebilmesini saÄŸlar.
FlowDocumentPageViewer MS Word ‘de tam ekran belgeleri okurken gözlemlenen yapının aynısı çalıştırılır.
FlowDocumentReader Diğer iki görüntülemenin özelliklerinin birleşimi biçimindedir. Kullanıldığı taktirde diğerlerinden farklı olarak arama çubuğuda aktif olmaktadır.
Görüntülemeler sonucunda aşağıdaki gibi sonuç alırız.

<FlowDocumentScrollViewer>
    <FlowDocument>
        ………………………
    </FlowDocument>
</FlowDocumentScrollViewer>



<FlowDocumentPageViewer>
    <FlowDocument>
        ………………………
    </FlowDocument>
</FlowDocumentPageViewer>



<FlowDocumentReader>
    <FlowDocument>
        ………………………
    </FlowDocument>
</FlowDocumentReader>



Dipnot Ekleme

FlowDocument ile hazırlanmış uygulamalara göz attığımızda dipnot ekleme gibi seçeneklerin bulunduğunu gözlemleriz. WPF, FlowDocument kontrolünde kullanabilmemiz için dipnot ekleme ve önemlilik belirleme gibi kontrolleri bizlere sunmuştur. Özellikleri kullanabilmemiz için Annotation sınıfını kullanabilmemiz gerekmektedir. Bunun için ise System.Windows.Annotations isim alanının uygulaya eklenmesi gerekmektedir. Dipnot işlemleri esnasında aşağıdaki kontrolleri kullanabilmemiz mümkündür.

Komut Kullanımı
CreateTextStickyNoteCommand Eklenmesi durumunda seçili metnin üzerine gelindiğinde yazı olarak not eklenmesini sağlar.
CreateInkStickyNoteCommand Eklenmesi durumunda seçili metnin üzerine gelindiğinde çizerek not eklenmesini sağlar.
DeleteStickyNoteCommand Etiket olarak eklenen dipnotları silmeyi sağlar.
CreateHighlightCommand CreateHighlightCommand
ClearHighlightCommand RenklendirilmiÅŸ metnin temizlenmesini saÄŸlar.

Yukarıdaki komutları kullanarak FlowDocument uygulamamızı özelleştirelim.

Uygulamamıza başlarken ilk yapacak olduğumuz işlem System.Windows.Annotations isim alanını eklemek olacaktır.



Daha sonrasında ise aşağıdaki XAML kodları ekliyoruz.

XAML kod
<Window x:Class="mak43.Window10"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:a="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework"
    Title="Dipnot" Initialized="Window_Initialized" Closed="Window_Closed">
    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label>Dipnot Kontrolleri</Label>
            <Button Command="a:AnnotationService.CreateTextStickyNoteCommand"
                CommandTarget="{Binding ElementName=reader}">Yazılı Not</Button>
            <Button Command="a:AnnotationService.CreateInkStickyNoteCommand"
                CommandTarget="{Binding ElementName=reader}">Çizimli Not</Button>
            <Button Command="a:AnnotationService.DeleteStickyNotesCommand"
                CommandTarget="{Binding ElementName=reader}">Not sil</Button>
            <Button Command="a:AnnotationService.CreateHighlightCommand"
                CommandTarget="{Binding ElementName=reader}" >Ãœstünü çiz</Button>
            <Button Command="a:AnnotationService.ClearHighlightsCommand"
                CommandTarget="{Binding ElementName=reader}">Ãœstünü temizle</Button>
        </StackPanel>
        <FlowDocumentReader x:Name="reader">
            <FlowDocument>
                <Paragraph FontSize="22">Windows Client</Paragraph>
                <Paragraph FontSize="30">WPF 'in Form Dünyasındaki Yeri</Paragraph>
                <Paragraph>
                    <Figure Width="130" HorizontalAnchor="PageRight" VerticalAnchor="PageTop">
                        <BlockUIContainer>
                            <Image Source="Turhal11.jpg"/>
                        </BlockUIContainer>
                    </Figure>
                    …
                </Paragraph>
                <Paragraph>…</Paragraph>
                <Paragraph>…</Paragraph>
                <Paragraph>…</Paragraph>
                <Paragraph>…</Paragraph>
                <Paragraph>…</Paragraph>
                <Paragraph>
                    <Bold>Turhal Temizer</Bold>
                </Paragraph>
            </FlowDocument>
        </FlowDocumentReader>
    </StackPanel>
</Window>

C# kod
using System;
using System.IO;
using System.Windows.Annotations;
using System.Windows.Annotations.Storage;
using System.Windows;

namespace mak43
{
    public partial class Window10 : Window
    {
        FileStream stream;
        public Window10()
        {
            InitializeComponent();
        }
   
        private void Window_Initialized(object sender, EventArgs e)
        {
            //dipnotlar yükleniyor ve aktif yapılıyor.
            AnnotationService service = AnnotationService.GetService(reader);
            if (service==null)
            {
                stream = new FileStream("yedek.xml", FileMode.OpenOrCreate);
                    service = new AnnotationService(reader);
                AnnotationStore store = new XmlStreamStore(stream);
                store.AutoFlush = true;
                service.Enable(store);
            }
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            //silinyor ve kaydediliyor.
            AnnotationService service = AnnotationService.GetService(reader);
            if (service!=null && service.IsEnabled)
            {
                service.Disable();
                stream.Close();
            }
        }
    }
}

Uygulamamızı derlediğimiz zaman sonuç ise aşağıdaki gibi olacaktır.



Sonuç oldukça baÅŸarılı. WPF ile FlowDocument ‘i kullanarak uygulama geliÅŸtirmenin ne kadar kolay yapıldığını gözlemlemiÅŸ olduk. Artık bizde birkaç haftalık çalışma ile kolayca bir New York Times Reader yapabiliriz.

Yazımızı sonuna gelmiş bulunuyor. Bu yazıda nelere değindiğimize kısaca açıklamak gerekirse, ilk olarak neden bu yazıyı yazacağımızı açıkladık, sonrasında yazı ve metin ile ilgili işlemleri ayrıntılı bir biçimde incelemeye çalıştık. Son olarak da FlowDocument kontrolünü inceleyerek WPF ile yapılmış Reader uygulamalarına benzer bir uygulama geliştirdik.

EÄŸer ki bizlerde kendimiz için Reader uygulaması geliÅŸtirmek istersek bunu nasıl yapabiliriz?” diye kafanıza soru takılabilir. Onu da kısaca açıklamak gerekirse, yukarıda deÄŸindiÄŸimiz konular sizin bir Reader yapmanıza yetecek düzeydedir. Fakat verilerinizi elle deÄŸil de dinamik olarak dışarıdan alacağınız için bu yazıları ya XML ‘de tutmalı ya da veri tabanından çekmelisinizdir. Bu iÅŸlem için web servis oluÅŸturmalı ve ulaÅŸtığınız içerikleri uygulamada kullandığınız kontrollere bind (baÄŸlamak) etmeniz gerekecektir. Daha sonrasında ise gerçek bir Reader uygulamasına sahip olmuÅŸ olacaksınız.

Windows Presentation Foundation ile Data Binding iÅŸlemleri nasıl yapılıyor?” diye kafanızda bir soru var ise daha önce yayınlanmış olan makaleyi okuyabilirsiniz.

Umarım yararlı olmuştur.

Yazımızda değinmiş olduğumuz uygulamanın kaynak kodlarına linkten erişebilirsiniz.
turhal.temizer@csharpnedir.com

Yorum Gönder

0 Yorumlar

Ad Code

Responsive Advertisement