Flow Belgesine Genel Bakış
Akış belgeleri görüntüleme ve okunabilirliği iyileştirmek için tasarlanmıştır. Akış belgeleri önceden tanımlanmış bir düzene ayarlamak yerine pencere boyutu, cihaz çözünürlüğü ve isteğe bağlı kullanıcı tercihleri gibi çalışma zamanı değişkenlerine göre içeriklerini dinamik olarak ayarlar ve yeniden akıtabilir. Buna ek olarak, akış belgeleri sayfalandırma ve sütunlar gibi gelişmiş belge özellikleri sunar. Bu konu başlığında akış belgelerine genel bir bakış ve bunların nasıl oluşturulacağı açıklanmaktadır.
Akış Belgesi nedir?
Akış belgesi, pencere boyutuna, cihaz çözünürlüğüne ve diğer ortam değişkenlerine bağlı olarak "içeriği yeniden akıtacak" şekilde tasarlanmıştır. Buna ek olarak, akış belgeleri arama, okunabilirliği en iyi duruma getiren görüntüleme modları ve yazı tiplerinin boyutunu ve görünümünü değiştirme gibi birçok yerleşik özelliğe sahiptir. Okuma kolaylığı birincil belge tüketimi senaryosu olduğunda Akış Belgeleri en iyi şekilde kullanılır. Buna karşılık, Sabit Belgeler statik bir sunuya sahip olacak şekilde tasarlanmıştır. Belgeler, kaynak içeriğin aslına uygunluğu önemli olduğunda yararlıdır. Farklı belge türleri hakkında daha fazla bilgi için bkz. WPF
Aşağıdaki çizimde, farklı boyutlardaki çeşitli pencerelerde görüntülenen bir örnek akış belgesi gösterilmektedir. Görüntü alanı değiştikçe içerik, mevcut alanı en iyi şekilde kullanmak için yeniden düzenlenir.
Yukarıdaki görüntüde görüldüğü gibi, akış içeriği paragraflar, listeler, resimler ve daha fazlası dahil olmak üzere birçok bileşeni içerebilir. Bu bileşenler işaretlemedeki öğelere ve yordam kodundaki nesnelere karşılık gelir. Bu sınıfları daha sonra bu genel bakışın Akışla İlgili Sınıflar bölümünde ayrıntılı olarak ele alacağız. Şimdilik, kalın metin ve liste içeren bir paragraf içeren bir akış belgesi oluşturan basit bir kod örneği aşağıda verilmiştir.
<!-- This simple flow document includes a paragraph with some
bold text in it and a list. -->
<FlowDocumentReader xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FlowDocument>
<Paragraph>
<Bold>Some bold text in the paragraph.</Bold>
Some text that is not bold.
</Paragraph>
<List>
<ListItem>
<Paragraph>ListItem 1</Paragraph>
</ListItem>
<ListItem>
<Paragraph>ListItem 2</Paragraph>
</ListItem>
<ListItem>
<Paragraph>ListItem 3</Paragraph>
</ListItem>
</List>
</FlowDocument>
</FlowDocumentReader>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace SDKSample
{
public partial class SimpleFlowExample : Page
{
public SimpleFlowExample()
{
Paragraph myParagraph = new Paragraph();
// Add some Bold text to the paragraph
myParagraph.Inlines.Add(new Bold(new Run("Some bold text in the paragraph.")));
// Add some plain text to the paragraph
myParagraph.Inlines.Add(new Run(" Some text that is not bold."));
// Create a List and populate with three list items.
List myList = new List();
// First create paragraphs to go into the list item.
Paragraph paragraphListItem1 = new Paragraph(new Run("ListItem 1"));
Paragraph paragraphListItem2 = new Paragraph(new Run("ListItem 2"));
Paragraph paragraphListItem3 = new Paragraph(new Run("ListItem 3"));
// Add ListItems with paragraphs in them.
myList.ListItems.Add(new ListItem(paragraphListItem1));
myList.ListItems.Add(new ListItem(paragraphListItem2));
myList.ListItems.Add(new ListItem(paragraphListItem3));
// Create a FlowDocument with the paragraph and list.
FlowDocument myFlowDocument = new FlowDocument();
myFlowDocument.Blocks.Add(myParagraph);
myFlowDocument.Blocks.Add(myList);
// Add the FlowDocument to a FlowDocumentReader Control
FlowDocumentReader myFlowDocumentReader = new FlowDocumentReader();
myFlowDocumentReader.Document = myFlowDocument;
this.Content = myFlowDocumentReader;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
Partial Public Class SimpleFlowExample
Inherits Page
Public Sub New()
Dim myParagraph As New Paragraph()
' Add some Bold text to the paragraph
myParagraph.Inlines.Add(New Bold(New Run("Some bold text in the paragraph.")))
' Add some plain text to the paragraph
myParagraph.Inlines.Add(New Run(" Some text that is not bold."))
' Create a List and populate with three list items.
Dim myList As New List()
' First create paragraphs to go into the list item.
Dim paragraphListItem1 As New Paragraph(New Run("ListItem 1"))
Dim paragraphListItem2 As New Paragraph(New Run("ListItem 2"))
Dim paragraphListItem3 As New Paragraph(New Run("ListItem 3"))
' Add ListItems with paragraphs in them.
myList.ListItems.Add(New ListItem(paragraphListItem1))
myList.ListItems.Add(New ListItem(paragraphListItem2))
myList.ListItems.Add(New ListItem(paragraphListItem3))
' Create a FlowDocument with the paragraph and list.
Dim myFlowDocument As New FlowDocument()
myFlowDocument.Blocks.Add(myParagraph)
myFlowDocument.Blocks.Add(myList)
' Add the FlowDocument to a FlowDocumentReader Control
Dim myFlowDocumentReader As New FlowDocumentReader()
myFlowDocumentReader.Document = myFlowDocument
Me.Content = myFlowDocumentReader
End Sub
End Class
End Namespace
Aşağıdaki çizimde bu kod parçacığının nasıl göründüğü gösterilmektedir.
Bu örnekte, akış içeriğini barındırmak için FlowDocumentReader denetimi kullanılır. Akış içeriği barındırma denetimleri hakkında daha fazla bilgi için bkz. Flow Belge Türleri. Paragraph, List, ListItemve Bold öğeleri, işaretleme sıralarına göre içerik biçimlendirmesini denetlemek için kullanılır. Örneğin, Bold öğesi paragraftaki metnin yalnızca bir bölümünü kaplar; sonuç olarak, metnin yalnızca bu bölümü kalın yazdırılır. HTML kullandıysanız, bu size tanıdık gelecek.
Yukarıdaki çizimde vurgulandığı gibi, Flow Belgeleri'nde yerleşik olarak bulunan birkaç özellik vardır:
Arama: Kullanıcının belgenin tamamında tam metin araması yapmasına izin verir.
Görüntüleme Modu: Kullanıcı, tek sayfalı (bir kerede sayfa) görüntüleme modu, bir kerede iki sayfalık (kitap okuma biçimi) görüntüleme modu ve sürekli kaydırma (altsız) görüntüleme modu gibi tercih ettiği görüntüleme modunu seçebilir. Bu görüntüleme modları hakkında daha fazla bilgi için bkz. FlowDocumentReaderViewingMode.
Sayfa Gezinti Denetimleri: Belgenin görüntüleme modu sayfaları kullanıyorsa, sayfa gezinti denetimleri sonraki sayfaya (aşağı ok) veya önceki sayfaya (yukarı ok) atlamak için bir düğmenin yanı sıra geçerli sayfa numarası ve toplam sayfa sayısı için göstergeler içerir. Sayfaları çevirme, klavye ok tuşları kullanılarak da gerçekleştirilebilir.
Yakınlaştırma: Yakınlaştırma denetimleri, kullanıcının sırasıyla artı veya eksi düğmelerine tıklayarak yakınlaştırma düzeyini artırmasını veya azaltmasını sağlar. Yakınlaştırma denetimleri, yakınlaştırma düzeyini ayarlamak için bir kaydırıcı da içerir. Daha fazla bilgi için bkz. Zoom.
Bu özellikler, akış içeriğini barındırmak için kullanılan denetime göre değiştirilebilir. Sonraki bölümde farklı denetimler açıklanmaktadır.
Akış Belgesi Türleri
Akış belgesi içeriğinin görüntülenmesi ve nasıl göründüğü, akış içeriğini barındırmak için kullanılan nesneye bağlıdır. Akış içeriğinin görüntülenmesini destekleyen dört denetim vardır: FlowDocumentReader, FlowDocumentPageViewer, RichTextBoxve FlowDocumentScrollViewer. Bu denetimler aşağıda kısaca açıklanmıştır.
Not
akış içeriğini doğrudan barındırmak için FlowDocument gereklidir, bu nedenle bu görüntüleme denetimlerinin tümü akış içeriği barındırmayı etkinleştirmek için bir FlowDocument kullanır.
FlowDocument Okuyucu
FlowDocumentReader, kullanıcının tek sayfalı (bir kerede sayfa) görüntüleme modu, bir kerede iki sayfalık (kitap okuma biçimi) görüntüleme modu ve sürekli kaydırma (altsız) görüntüleme modu gibi çeşitli görüntüleme modları arasında dinamik olarak seçim yapmasını sağlayan özellikler içerir. Bu görüntüleme modları hakkında daha fazla bilgi için bkz. FlowDocumentReaderViewingMode. Farklı görüntüleme modları arasında dinamik olarak geçiş yapma yeteneğine ihtiyacınız yoksa, FlowDocumentPageViewer ve FlowDocumentScrollViewer belirli bir görüntüleme modunda sabitlenmiş daha hafif akış içerik görüntüleyicileri sağlar.
FlowDocumentPageViewer ve FlowDocumentScrollViewer
FlowDocumentPageViewer içeriği bir kerede sayfa görüntüleme modunda, FlowDocumentScrollViewer ise içeriği sürekli kaydırma modunda gösterir. Hem FlowDocumentPageViewer hem de FlowDocumentScrollViewer belirli bir görüntüleme moduna sabitlenir. FlowDocumentPageViewer veya FlowDocumentScrollViewer'den daha yoğun kaynak kullanım maliyetiyle, kullanıcının çeşitli görüntüleme modları (FlowDocumentReaderViewingMode numaralandırması tarafından sağlandığı gibi) arasında dinamik olarak seçim yapmasını sağlayan özellikler içeren FlowDocumentReaderile karşılaştırın.
Varsayılan olarak, dikey kaydırma çubuğu her zaman gösterilir ve gerekirse yatay kaydırma çubuğu görünür hale gelir. FlowDocumentScrollViewer için varsayılan kullanıcı arabirimi bir araç çubuğu içermez; ancak, IsToolBarVisible özelliği yerleşik bir araç çubuğunu etkinleştirmek için kullanılabilir.
RichTextBox
Kullanıcının akış içeriğini düzenlemesine izin vermek istediğinizde bir RichTextBox kullanırsınız. Örneğin, kullanıcının tablolar, italik ve kalın biçimlendirme gibi öğeleri işlemesine izin veren bir düzenleyici oluşturmak istiyorsanız, RichTextBoxkullanırsınız. Daha fazla bilgi için bkz. RichTextBox'a Genel Bakış
Not
RichTextBox içindeki akış içeriği, diğer denetimlerde yer alan akış içeriği gibi davranmaz. Örneğin, bir RichTextBox'da sütun yoktur ve bu nedenle otomatik boyutlandırma davranışı yoktur. Ayrıca, akış içeriğinin arama, görüntüleme modu, sayfa gezintisi ve yakınlaştırma gibi genellikle yerleşik özellikleri bir RichTextBoxiçinde kullanılamaz.
Akış İçeriği Oluşturma
Akış içeriği, metin, resim, tablo ve hatta denetimler gibi türetilmiş UIElement sınıflar gibi çeşitli öğelerden oluşan karmaşık olabilir. Karmaşık akış içeriğinin nasıl oluşturulacağını anlamak için aşağıdaki noktalar kritik öneme sahiptir:
Akışla İlgili Sınıflar: Akış içeriğinde kullanılan her sınıfın belirli bir amacı vardır. Buna ek olarak, akış sınıfları arasındaki hiyerarşik ilişki, bunların nasıl kullanıldığını anlamanıza yardımcı olur. Örneğin, Block sınıfından türetilen sınıflar diğer nesneleri içermek için kullanılırken, Inline türetilen sınıflar görüntülenen nesneleri içerir.
İçerik Şeması: Akış belgesi çok sayıda iç içe öğe gerektirebilir. İçerik şeması, öğeler arasındaki olası üst/alt ilişkileri belirtir.
Aşağıdaki bölümlerde bu alanların her biri daha ayrıntılı olarak ele alınacaktır.
Akışla İlgili Sınıflar
Aşağıdaki diyagramda genellikle akış içeriğiyle kullanılan nesneler gösterilmektedir:
Akış içeriğinin amaçları doğrultusunda iki önemli kategori vardır:
Blok'tan türetilen sınıflar: "Blok içerik öğeleri" veya yalnızca "Blok Öğeler" olarak da adlandırılır. Block'den devralan öğeler, ortak bir üst öğe altındaki öğeleri gruplandırmak veya bir gruba ortak öznitelikler uygulamak için kullanılabilir.
satır içi türetilmiş sınıfları : "Satır içi içerik öğeleri" veya yalnızca "Satır İçi Öğeler" olarak da adlandırılır. Inline'den devralan öğeler bir Block Öğesi veya başka bir Satır içi Öğesi içinde yer alır. Satır içi Öğeler genellikle ekrana işlenen içeriğin doğrudan kapsayıcısı olarak kullanılır. Örneğin, bir Paragraph (Blok Öğesi) bir Run (Satır içi Öğesi) içerebilir, ancak Run aslında ekranda işlenen metni içerir.
Bu iki kategorideki her sınıf aşağıda kısaca açıklanmıştır.
Blok türetilmiş Sınıflar
Paragraf
Paragraph genellikle içeriği paragraf olarak gruplandırmak için kullanılır. Paragraf'ın en basit ve en yaygın kullanımı bir metin paragrafı oluşturmaktır.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Paragraph>
Some paragraph text.
</Paragraph>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace SDKSample
{
public partial class ParagraphExample : Page
{
public ParagraphExample()
{
// Create paragraph with some text.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add(new Run("Some paragraph text."));
// Create a FlowDocument and add the paragraph to it.
FlowDocument myFlowDocument = new FlowDocument();
myFlowDocument.Blocks.Add(myParagraph);
this.Content = myFlowDocument;
}
}
}
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
Partial Public Class ParagraphExample
Inherits Page
Public Sub New()
' Create paragraph with some text.
Dim myParagraph As New Paragraph()
myParagraph.Inlines.Add(New Run("Some paragraph text."))
' Create a FlowDocument and add the paragraph to it.
Dim myFlowDocument As New FlowDocument()
myFlowDocument.Blocks.Add(myParagraph)
Me.Content = myFlowDocument
End Sub
End Class
End Namespace
Ancak, aşağıda göreceğiniz gibi satır içi türetilmiş diğer öğeleri de içerebilirsiniz.
Bölüm
Section yalnızca diğer Blocktüretilmiş öğeleri içermek için kullanılır. İçerdiği öğelere varsayılan biçimlendirme uygulamaz. Ancak, bir Section üzerinde ayarlanan herhangi bir özellik değeri, alt öğelerine uygulanır. Bir bölüm, alt koleksiyonu üzerinde programlı olarak yinelemenizi de sağlar. Section, HTML'deki <DIV> etiketine benzer şekilde kullanılır.
Aşağıdaki örnekte, bir Sectionaltında üç paragraf tanımlanmıştır. Bölümün Background özellik değeri Kırmızı olduğundan paragrafların arka plan rengi de kırmızıdır.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- By default, Section applies no formatting to elements contained
within it. However, in this example, the section has a Background
property value of "Red", therefore, the three paragraphs (the block)
inside the section also have a red background. -->
<Section Background="Red">
<Paragraph>
Paragraph 1
</Paragraph>
<Paragraph>
Paragraph 2
</Paragraph>
<Paragraph>
Paragraph 3
</Paragraph>
</Section>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;
namespace SDKSample
{
public partial class SectionExample : Page
{
public SectionExample()
{
// Create three paragraphs
Paragraph myParagraph1 = new Paragraph(new Run("Paragraph 1"));
Paragraph myParagraph2 = new Paragraph(new Run("Paragraph 2"));
Paragraph myParagraph3 = new Paragraph(new Run("Paragraph 3"));
// Create a Section and add the three paragraphs to it.
Section mySection = new Section();
mySection.Background = Brushes.Red;
mySection.Blocks.Add(myParagraph1);
mySection.Blocks.Add(myParagraph2);
mySection.Blocks.Add(myParagraph3);
// Create a FlowDocument and add the section to it.
FlowDocument myFlowDocument = new FlowDocument();
myFlowDocument.Blocks.Add(mySection);
this.Content = myFlowDocument;
}
}
}
Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
Partial Public Class SectionExample
Inherits Page
Public Sub New()
' Create three paragraphs
Dim myParagraph1 As New Paragraph(New Run("Paragraph 1"))
Dim myParagraph2 As New Paragraph(New Run("Paragraph 2"))
Dim myParagraph3 As New Paragraph(New Run("Paragraph 3"))
' Create a Section and add the three paragraphs to it.
Dim mySection As New Section()
mySection.Background = Brushes.Red
mySection.Blocks.Add(myParagraph1)
mySection.Blocks.Add(myParagraph2)
mySection.Blocks.Add(myParagraph3)
' Create a FlowDocument and add the section to it.
Dim myFlowDocument As New FlowDocument()
myFlowDocument.Blocks.Add(mySection)
Me.Content = myFlowDocument
End Sub
End Class
End Namespace
BlockUIContainer
BlockUIContainer, UIElement öğelerinin (örneğin Button) blok bazlı akış içeriğine gömülmesine olanak tanır. InlineUIContainer (aşağıya bakın) satır içi türetilmiş akış içeriğine UIElement öğeleri eklemek için kullanılır. BlockUIContainer ve InlineUIContainer önemlidir çünkü akış içeriğinde bu iki öğeden birinde yer almadığı sürece UIElement kullanmanın başka bir yolu yoktur.
Aşağıdaki örnekte, akış içeriğindeki UIElement nesneleri barındırmak için BlockUIContainer öğesinin nasıl kullanılacağı gösterilmektedir.
<FlowDocument ColumnWidth="400">
<Section Background="GhostWhite">
<Paragraph>
A UIElement element may be embedded directly in flow content
by enclosing it in a BlockUIContainer element.
</Paragraph>
<BlockUIContainer>
<Button>Click me!</Button>
</BlockUIContainer>
<Paragraph>
The BlockUIContainer element may host no more than one top-level
UIElement. However, other UIElements may be nested within the
UIElement contained by an BlockUIContainer element. For example,
a StackPanel can be used to host multiple UIElement elements within
a BlockUIContainer element.
</Paragraph>
<BlockUIContainer>
<StackPanel>
<Label Foreground="Blue">Choose a value:</Label>
<ComboBox>
<ComboBoxItem IsSelected="True">a</ComboBoxItem>
<ComboBoxItem>b</ComboBoxItem>
<ComboBoxItem>c</ComboBoxItem>
</ComboBox>
<Label Foreground ="Red">Choose a value:</Label>
<StackPanel>
<RadioButton>x</RadioButton>
<RadioButton>y</RadioButton>
<RadioButton>z</RadioButton>
</StackPanel>
<Label>Enter a value:</Label>
<TextBox>
A text editor embedded in flow content.
</TextBox>
</StackPanel>
</BlockUIContainer>
</Section>
</FlowDocument>
Aşağıdaki şekilde bu örneğin nasıl görselleştirildiği gösterilmektedir.
Listesi
List madde işaretli veya sayısal liste oluşturmak için kullanılır. Listenin stilini belirlemek için MarkerStyle özelliğini bir TextMarkerStyle numaralandırma değerine ayarlayın. Aşağıdaki örnekte basit bir listenin nasıl oluşturulacağı gösterilmektedir.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<List>
<ListItem>
<Paragraph>
List Item 1
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
List Item 2
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
List Item 3
</Paragraph>
</ListItem>
</List>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;
namespace SDKSample
{
public partial class ListExample : Page
{
public ListExample()
{
// Create three paragraphs
Paragraph myParagraph1 = new Paragraph(new Run("List Item 1"));
Paragraph myParagraph2 = new Paragraph(new Run("List Item 2"));
Paragraph myParagraph3 = new Paragraph(new Run("List Item 3"));
// Create the ListItem elements for the List and add the
// paragraphs to them.
ListItem myListItem1 = new ListItem();
myListItem1.Blocks.Add(myParagraph1);
ListItem myListItem2 = new ListItem();
myListItem2.Blocks.Add(myParagraph2);
ListItem myListItem3 = new ListItem();
myListItem3.Blocks.Add(myParagraph3);
// Create a List and add the three ListItems to it.
List myList = new List();
myList.ListItems.Add(myListItem1);
myList.ListItems.Add(myListItem2);
myList.ListItems.Add(myListItem3);
// Create a FlowDocument and add the section to it.
FlowDocument myFlowDocument = new FlowDocument();
myFlowDocument.Blocks.Add(myList);
this.Content = myFlowDocument;
}
}
}
Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
Partial Public Class ListExample
Inherits Page
Public Sub New()
' Create three paragraphs
Dim myParagraph1 As New Paragraph(New Run("List Item 1"))
Dim myParagraph2 As New Paragraph(New Run("List Item 2"))
Dim myParagraph3 As New Paragraph(New Run("List Item 3"))
' Create the ListItem elements for the List and add the
' paragraphs to them.
Dim myListItem1 As New ListItem()
myListItem1.Blocks.Add(myParagraph1)
Dim myListItem2 As New ListItem()
myListItem2.Blocks.Add(myParagraph2)
Dim myListItem3 As New ListItem()
myListItem3.Blocks.Add(myParagraph3)
' Create a List and add the three ListItems to it.
Dim myList As New List()
myList.ListItems.Add(myListItem1)
myList.ListItems.Add(myListItem2)
myList.ListItems.Add(myListItem3)
' Create a FlowDocument and add the section to it.
Dim myFlowDocument As New FlowDocument()
myFlowDocument.Blocks.Add(myList)
Me.Content = myFlowDocument
End Sub
End Class
End Namespace
Not
List, alt öğeleri yönetmek için ListItemCollection kullanan tek akış öğesidir.
tablo
Table tablo oluşturmak için kullanılır. Table Grid öğesine benzer, ancak daha fazla özelliğe sahiptir ve bu nedenle daha fazla kaynak yükü gerektirir. Grid bir UIElementolduğundan, bir BlockUIContainer veya InlineUIContaineriçermediği sürece akış içeriğinde kullanılamaz. Tablehakkında daha fazla bilgi için bkz. Tabloya Genel Bakış.
Satır içi türetilmiş sınıflar
Çalıştır
Run biçimlendirilmemiş metinler içermek için kullanılır. Akış içeriğinde Run nesnelerin yoğun olarak kullanılmasını bekleyebilirsiniz. Ancak, işaretlemede Run öğelerin açıkça kullanılması gerekmez. Run, kod kullanarak akış belgeleri oluştururken veya düzenlerken kullanılmalıdır. Örneğin, aşağıdaki işaretlemede, ilk ParagraphRun öğesini açıkça belirtirken ikinci öğe belirtilmez. Her iki paragraf da aynı çıkışı oluşturur.
<Paragraph>
<Run>Paragraph that explicitly uses the Run element.</Run>
</Paragraph>
<Paragraph>
This Paragraph omits the Run element in markup. It renders
the same as a Paragraph with Run used explicitly.
</Paragraph>
Not veya Bilgi
.NET Framework 4'den başlayarak, Run nesnesinin Text özelliği bir bağımlılık özelliğidir. Text özelliğini TextBlockgibi bir veri kaynağına bağlayabilirsiniz. Text özelliği tek yönlü bağlamayı tam olarak destekler. Text özelliği, RichTextBoxdışında iki yönlü bağlamayı da destekler. Bir örnek için bkz. Run.Text.
Span
Span diğer satır içi içerik öğelerini birlikte gruplandırır. bir Span öğesi içindeki içeriğe doğal işleme uygulanmaz. Ancak, Hyperlink, Bold, Italic ve Underline gibi Span devralan öğeler metne biçimlendirme uygular.
Aşağıda metin, Bold öğesi ve Buttongibi satır içi içerik içeren bir Span örneği verilmiştir.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Paragraph>
Text before the Span. <Span Background="Red">Text within the Span is
red and <Bold>this text is inside the Span-derived element Bold.</Bold>
A Span can contain more then text, it can contain any inline content. For
example, it can contain a
<InlineUIContainer>
<Button>Button</Button>
</InlineUIContainer>
or other UIElement, a Floater, a Figure, etc.</Span>
</Paragraph>
</FlowDocument>
Aşağıdaki ekran görüntüsü, bu örneğin nasıl görselleştirildiğini göstermektedir.
InlineUIContainer
InlineUIContainer, UIElement öğelerin (Buttongibi bir denetim) Inline içerik öğesine katıştırılabilmesini sağlar. Bu öğe, yukarıda açıklanan BlockUIContainer satır içi eşdeğeridir. Aşağıda, Paragraphsatır içine Button eklemek için InlineUIContainer kullanan bir örnek verilmiştir.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Paragraph>
Text to precede the button...
<!-- Set the BaselineAlignment property to "Bottom"
so that the Button aligns properly with the text. -->
<InlineUIContainer BaselineAlignment="Bottom">
<Button>Button</Button>
</InlineUIContainer>
Text to follow the button...
</Paragraph>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;
namespace SDKSample
{
public partial class InlineUIContainerExample : Page
{
public InlineUIContainerExample()
{
Run run1 = new Run(" Text to precede the button... ");
Run run2 = new Run(" Text to follow the button... ");
// Create a new button to be hosted in the paragraph.
Button myButton = new Button();
myButton.Content = "Click me!";
// Create a new InlineUIContainer to contain the Button.
InlineUIContainer myInlineUIContainer = new InlineUIContainer();
// Set the BaselineAlignment property to "Bottom" so that the
// Button aligns properly with the text.
myInlineUIContainer.BaselineAlignment = BaselineAlignment.Bottom;
// Asign the button as the UI container's child.
myInlineUIContainer.Child = myButton;
// Create the paragraph and add content to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add(run1);
myParagraph.Inlines.Add(myInlineUIContainer);
myParagraph.Inlines.Add(run2);
// Create a FlowDocument and add the paragraph to it.
FlowDocument myFlowDocument = new FlowDocument();
myFlowDocument.Blocks.Add(myParagraph);
this.Content = myFlowDocument;
}
}
}
Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
Partial Public Class InlineUIContainerExample
Inherits Page
Public Sub New()
Dim run1 As New Run(" Text to precede the button... ")
Dim run2 As New Run(" Text to follow the button... ")
' Create a new button to be hosted in the paragraph.
Dim myButton As New Button()
myButton.Content = "Click me!"
' Create a new InlineUIContainer to contain the Button.
Dim myInlineUIContainer As New InlineUIContainer()
' Set the BaselineAlignment property to "Bottom" so that the
' Button aligns properly with the text.
myInlineUIContainer.BaselineAlignment = BaselineAlignment.Bottom
' Asign the button as the UI container's child.
myInlineUIContainer.Child = myButton
' Create the paragraph and add content to it.
Dim myParagraph As New Paragraph()
myParagraph.Inlines.Add(run1)
myParagraph.Inlines.Add(myInlineUIContainer)
myParagraph.Inlines.Add(run2)
' Create a FlowDocument and add the paragraph to it.
Dim myFlowDocument As New FlowDocument()
myFlowDocument.Blocks.Add(myParagraph)
Me.Content = myFlowDocument
End Sub
End Class
End Namespace
Nota
InlineUIContainer işaretlemede açıkça kullanılması gerekmez. Bunu atlarsanız, kod derlendiğinde yine de bir InlineUIContainer oluşturulur.
Şekil ve Kayan
Figure ve Floater, birincil içerik akışından bağımsız olarak özelleştirilebilen yerleştirme özelliklerine sahip Akış Belgelerine içerik eklemek için kullanılır. Figure veya Floater öğeleri genellikle içeriğin bölümlerini vurgulamak veya vurgulamak, ana içerik akışı içinde destekleyici görüntüleri veya diğer içerikleri barındırmak veya reklamlar gibi gevşek bir şekilde ilişkili içerik eklemek için kullanılır.
Aşağıdaki örnekte, bir metin paragrafının içine Figure ekleme gösterilmektedir.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Paragraph>
<Figure
Width="300" Height="100"
Background="GhostWhite" HorizontalAnchor="PageLeft" >
<Paragraph FontStyle="Italic" Background="Beige" Foreground="DarkGreen" >
A Figure embeds content into flow content with placement properties
that can be customized independently from the primary content flow
</Paragraph>
</Figure>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy
nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi
enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis
nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.
</Paragraph>
</FlowDocument>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Documents;
namespace SDKSample
{
public partial class FigureExample : Page
{
public FigureExample()
{
// Create strings to use as content.
string strFigure = "A Figure embeds content into flow content with" +
" placement properties that can be customized" +
" independently from the primary content flow";
string strOther = "Lorem ipsum dolor sit amet, consectetuer adipiscing" +
" elit, sed diam nonummy nibh euismod tincidunt ut laoreet" +
" dolore magna aliquam erat volutpat. Ut wisi enim ad" +
" minim veniam, quis nostrud exerci tation ullamcorper" +
" suscipit lobortis nisl ut aliquip ex ea commodo consequat." +
" Duis autem vel eum iriure.";
// Create a Figure and assign content and layout properties to it.
Figure myFigure = new Figure();
myFigure.Width = new FigureLength(300);
myFigure.Height = new FigureLength(100);
myFigure.Background = Brushes.GhostWhite;
myFigure.HorizontalAnchor = FigureHorizontalAnchor.PageLeft;
Paragraph myFigureParagraph = new Paragraph(new Run(strFigure));
myFigureParagraph.FontStyle = FontStyles.Italic;
myFigureParagraph.Background = Brushes.Beige;
myFigureParagraph.Foreground = Brushes.DarkGreen;
myFigure.Blocks.Add(myFigureParagraph);
// Create the paragraph and add content to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add(myFigure);
myParagraph.Inlines.Add(new Run(strOther));
// Create a FlowDocument and add the paragraph to it.
FlowDocument myFlowDocument = new FlowDocument();
myFlowDocument.Blocks.Add(myParagraph);
this.Content = myFlowDocument;
}
}
}
Imports System.Windows
Imports System.Windows.Media
Imports System.Windows.Controls
Imports System.Windows.Documents
Namespace SDKSample
Partial Public Class FigureExample
Inherits Page
Public Sub New()
' Create strings to use as content.
Dim strFigure As String = "A Figure embeds content into flow content with" & " placement properties that can be customized" & " independently from the primary content flow"
Dim strOther As String = "Lorem ipsum dolor sit amet, consectetuer adipiscing" & " elit, sed diam nonummy nibh euismod tincidunt ut laoreet" & " dolore magna aliquam erat volutpat. Ut wisi enim ad" & " minim veniam, quis nostrud exerci tation ullamcorper" & " suscipit lobortis nisl ut aliquip ex ea commodo consequat." & " Duis autem vel eum iriure."
' Create a Figure and assign content and layout properties to it.
Dim myFigure As New Figure()
myFigure.Width = New FigureLength(300)
myFigure.Height = New FigureLength(100)
myFigure.Background = Brushes.GhostWhite
myFigure.HorizontalAnchor = FigureHorizontalAnchor.PageLeft
Dim myFigureParagraph As New Paragraph(New Run(strFigure))
myFigureParagraph.FontStyle = FontStyles.Italic
myFigureParagraph.Background = Brushes.Beige
myFigureParagraph.Foreground = Brushes.DarkGreen
myFigure.Blocks.Add(myFigureParagraph)
' Create the paragraph and add content to it.
Dim myParagraph As New Paragraph()
myParagraph.Inlines.Add(myFigure)
myParagraph.Inlines.Add(New Run(strOther))
' Create a FlowDocument and add the paragraph to it.
Dim myFlowDocument As New FlowDocument()
myFlowDocument.Blocks.Add(myParagraph)
Me.Content = myFlowDocument
End Sub
End Class
End Namespace
Aşağıdaki illüstrasyon, bu örneğin nasıl işlendiğini göstermektedir.
Figure ve Floater farklı şekillerde farklılık gösterir ve farklı senaryolar için kullanılır.
Şekil:
Konumlandırılabilir: Yatay ve dikey tutturucularını sayfaya, içeriğe, sütuna veya paragrafa göre yerleştirecek şekilde ayarlayabilirsiniz. Rastgele uzaklıkları belirtmek için HorizontalOffset ve VerticalOffset özelliklerini de kullanabilirsiniz.
Birden fazla sütuna göre boyutlandırılabilir: Figure yükseklik ve genişliği sayfa, içerik veya sütun yüksekliğinin veya genişliğinin katları olarak ayarlayabilirsiniz. Sayfa ve içerik söz konusu olduğunda, 1'den büyük katlara izin verilmediğini unutmayın. Örneğin, bir Figure genişliğini "0,5 sayfa" veya "0,25 içerik" veya "2 Sütun" olarak ayarlayabilirsiniz. Yükseklik ve genişliği mutlak piksel değerlerine de ayarlayabilirsiniz.
Sayfalara ayırmaz: Eğer bir Figure içindeki içerik Figureiçine sığmıyorsa, sığabilen içeriği işler ve geri kalan içerik kaybolur.
Floater:
Konumlandırılamaz ve alan bulunabildiği her yerde işlenir. bir Floateruzaklığını ayarlayamazsınız veya sabitleyemezsiniz.
Birden fazla sütun olacak şekilde boyutlandırılamaz: Varsayılan olarak, Floater bir sütuna boyutlandırılır. Mutlak piksel değerine ayarlanabilen bir Width özelliği vardır, ancak bu değer bir sütun genişliğinden büyükse yoksayılır ve kayan öğe bir sütunda boyutlandırılır. Doğru piksel genişliğini ayarlayarak bunu birden az sütuna boyutlandırabilirsiniz, ancak boyutlandırma sütuna göre değildir, bu nedenle "0,5Column" Floater genişliği için geçerli bir ifade değildir. Floater height özelliği yoktur ve yüksekliği ayarlanamaz, yüksekliği içeriğe bağlıdır
Floater sayfalandırılır: Belirtilen genişlikteki içeriği 1 sütun yüksekliğini aşıyorsa, kayan öğe kırılır ve sonraki sütuna, sonraki sayfaya vb. sayfalandırılır.
Figure, boyutu ve konumlandırmayı denetlemek istediğiniz ve içeriğin belirtilen boyuta sığacağından emin olmak istediğiniz tek başına içeriği yerleştirmek için iyi bir yerdir. Floater, ana sayfa içeriğine benzer, ancak ondan ayrılmış daha serbest akışlı içerik yerleştirmek için iyi bir yerdir.
LineBreak
LineBreak akış içeriğinde satır sonu oluşmasına neden olur. Aşağıdaki örnekte LineBreakkullanımı gösterilmektedir.
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Paragraph>
Before the LineBreak in Paragraph.
<LineBreak />
After the LineBreak in Paragraph.
<LineBreak/><LineBreak/>
After two LineBreaks in Paragraph.
</Paragraph>
<Paragraph>
<LineBreak/>
</Paragraph>
<Paragraph>
After a Paragraph with only a LineBreak in it.
</Paragraph>
</FlowDocument>
Aşağıdaki ekran görüntüsü bu örneğin nasıl göründüğünü göstermektedir.
Akış Koleksiyonu Öğeleri
Yukarıdaki örneklerin çoğunda, akış içeriğini program aracılığıyla oluşturmak için BlockCollection ve InlineCollection kullanılır. Örneğin, bir Paragraph'a öğeler eklemek için söz dizimi şöyle kullanabilirsiniz:
myParagraph.Inlines.Add(new Run("Some text"));
Bu, Run'i Paragraph'nin InlineCollection'ine ekler. Bu, işaretlemedeki Paragraph içinde bulunan örtük Run ile aynıdır.
<Paragraph>
Some Text
</Paragraph>
BlockCollectionkullanma örneği olarak, aşağıdaki örnek yeni bir Section oluşturur ve ardından Section içeriğine yeni bir Paragraph eklemek için Ekle yöntemini kullanır.
Section secx = new Section();
secx.Blocks.Add(new Paragraph(new Run("A bit of text content...")));
Dim secx As New Section()
secx.Blocks.Add(New Paragraph(New Run("A bit of text content...")))
Akış koleksiyonuna öğe eklemeye ek olarak, öğeleri de kaldırabilirsiniz. Aşağıdaki örnek, Spaniçindeki son Inline öğesini siler.
spanx.Inlines.Remove(spanx.Inlines.LastInline);
spanx.Inlines.Remove(spanx.Inlines.LastInline)
Aşağıdaki örnek, Spaniçindekilerin (Inline öğeleri) tümünü temizler.
spanx.Inlines.Clear();
spanx.Inlines.Clear()
Akış içeriğiyle program aracılığıyla çalışırken büyük olasılıkla bu koleksiyonları kapsamlı bir şekilde kullanırsınız.
Akış öğesinin alt öğelerini içermek için bir InlineCollection (Satır içi) veya BlockCollection (Bloklar) kullanıp kullanmadığı, ebeveyn öğe tarafından hangi tür alt öğelerin (Block veya Inline) içerilebileceğine bağlıdır. Akış içeriği öğeleri için kapsama kuralları, sonraki bölümdeki içerik şemasında özetlenmiştir.
Not
Akış içeriğiyle kullanılan üçüncü bir koleksiyon türü (ListItemCollection) vardır, ancak bu koleksiyon yalnızca Listile kullanılır. Ayrıca, Tableile kullanılan birkaç koleksiyon vardır. Daha fazla bilgi için bkz. Tabloya Genel Bakış.
İçerik Şeması
Farklı akış içeriği elemanlarının sayısı göz önüne alındığında, bir öğenin hangi tür alt elemanları içerebileceğini takip etmek zorlayıcı olabilir. Aşağıdaki diyagramda akış öğeleri için kapsama kuralları özetlenmiştir. Oklar muhtemel ebeveyn/çocuk ilişkilerini temsil eder.
Yukarıdaki diyagramdan görülebileceği gibi, bir öğe için izin verilen çocuklar, o öğenin Block elemanı mı yoksa Inline elemanı mı olduğuna göre mutlaka belirlenmez. Örneğin, bir Span (Inline öğesi) yalnızca Inline alt öğeye sahip olabilirken, bir Figure (aynı zamanda bir Inline öğesi) yalnızca Block alt öğeye sahip olabilir. Bu nedenle diyagram, başka bir öğede hangi öğenin bulunabileceğini hızla belirlemek için kullanışlıdır. Örnek olarak, bir RichTextBoxakış içeriğinin nasıl oluşturacağınızı belirlemek için diyagramı kullanalım.
1. bir RichTextBox, içinde Blocktüretilmiş bir nesne bulunduran bir FlowDocument içermek zorundadır. Yukarıdaki diyagramda karşılık gelen segment aşağıdadır.
Şu ana kadar, işaretleme bu şekilde görünebilir.
<RichTextBox>
<FlowDocument>
<!-- One or more Block-derived object… -->
</FlowDocument>
</RichTextBox>
2. Diyagrama göre, Paragraph, Section, Table, Listve BlockUIContainer dahil olmak üzere seçebileceğiniz çeşitli Block öğeleri vardır (yukarıdaki Blok türetilmiş sınıflar bölümüne bakın). Diyelim ki bir Tableistiyoruz. Yukarıdaki diyagrama göre, bir Table, Blocktüretilmiş bir nesne içeren TableCell öğeleri içeren TableRow öğelerini içeren bir TableRowGroup içerir. Yukarıdaki diyagramdan alınan Table'a karşılık gelen segment aşağıdadır.
Aşağıda karşılık gelen işaretleme yer alır.
<RichTextBox>
<FlowDocument>
<Table>
<TableRowGroup>
<TableRow>
<TableCell>
<!-- One or more Block-derived object… -->
</TableCell>
</TableRow>
</TableRowGroup>
</Table>
</FlowDocument>
</RichTextBox>
3. Yeniden, bir TableCellaltında bir veya daha fazla Block öğesi gerekir. Bunu basit hale getirmek için hücrenin içine biraz metin yerleştirelim. Şunu, Paragraph ile Run öğesi kullanarak yapabiliriz. Diyagramdaki ilgili bölümler aşağıda yer almakta olup, bir ParagraphInline öğesi alabilir ve bir Run (Inline öğesi) yalnızca düz metin alabilir.
için ebeveyn/çocuk şeması
için Ebeveyn/Çocuk şeması
Aşağıda, işaretlemedeki tüm örnek verilmiştir.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<RichTextBox>
<FlowDocument>
<!-- Normally a table would have multiple rows and multiple
cells but this code is for demonstration purposes.-->
<Table>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph>
<!-- The schema does not actually require
explicit use of the Run tag in markup. It
is only included here for clarity. -->
<Run>Paragraph in a Table Cell.</Run>
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
</Table>
</FlowDocument>
</RichTextBox>
</Page>
Metni Özelleştirme
Genellikle metin, akış belgesindeki en yaygın içerik türüdür. Yukarıda tanıtılan nesneler, metnin işlenme şeklinin çoğu yönünü denetlemek için kullanılabilse de, bu bölümde ele alınan metni özelleştirmeye yönelik başka yöntemler de vardır.
Metin Süslemeleri
Metin süslemeleri, metne alt çizgi, üst çizgi, taban çizgisi ve üstü çizili efektleri uygulamanıza olanak sağlar (aşağıdaki resimlere bakın). Bu süslemeler, Inline, Paragraph, TextBlockve TextBoxdahil birçok nesnenin erişime açtığı TextDecorations özelliği kullanılarak eklenir.
Aşağıdaki örnekte, bir ParagraphTextDecorations özelliğinin nasıl ayarlanacağı gösterilmektedir.
<FlowDocument ColumnWidth="200">
<Paragraph TextDecorations="Strikethrough">
This text will render with the strikethrough effect.
</Paragraph>
</FlowDocument>
Paragraph parx = new Paragraph(new Run("This text will render with the strikethrough effect."));
parx.TextDecorations = TextDecorations.Strikethrough;
Dim parx As New Paragraph(New Run("This text will render with the strikethrough effect."))
parx.TextDecorations = TextDecorations.Strikethrough
Aşağıdaki şekil bu örneğin nasıl işlediğini göstermektedir.
Aşağıdaki şekiller, Üst Çizgi, Baş Çizgisive Alt Çizgi dekorlarının sırasıyla nasıl göründüğünü göstermektedir.
Tipografi
Typography özelliği, TextElement, FlowDocument, TextBlockve TextBoxdahil olmak üzere akışla ilgili çoğu içerik tarafından açığa çıkarılır. Bu özellik, metnin tipografik özelliklerini/çeşitlemelerini (küçük veya büyük harf, üst simge ve alt simge yapma vb.) denetlemek için kullanılır.
Aşağıdaki örnekte, örnek öğe olarak Paragraph kullanılarak Typography özniteliğinin nasıl ayarlanacağı gösterilmektedir.
<Paragraph
TextAlignment="Left"
FontSize="18"
FontFamily="Palatino Linotype"
Typography.NumeralStyle="OldStyle"
Typography.Fraction="Stacked"
Typography.Variants="Inferior"
>
<Run>
This text has some altered typography characteristics. Note
that use of an open type font is necessary for most typographic
properties to be effective.
</Run>
<LineBreak/><LineBreak/>
<Run>
0123456789 10 11 12 13
</Run>
<LineBreak/><LineBreak/>
<Run>
1/2 2/3 3/4
</Run>
</Paragraph>
Aşağıdaki şekilde bu örneğin nasıl görselleştirildiği gösterilmektedir.
Buna karşılık, aşağıdaki şekil, varsayılan tipografik özelliklere sahip benzer bir örneğin nasıl işlem gördüğünü göstermektedir.
Aşağıdaki örnekte, Typography özelliğinin program aracılığıyla nasıl ayarlanacağı gösterilmektedir.
Paragraph par = new Paragraph();
Run runText = new Run(
"This text has some altered typography characteristics. Note" +
"that use of an open type font is necessary for most typographic" +
"properties to be effective.");
Run runNumerals = new Run("0123456789 10 11 12 13");
Run runFractions = new Run("1/2 2/3 3/4");
par.Inlines.Add(runText);
par.Inlines.Add(new LineBreak());
par.Inlines.Add(new LineBreak());
par.Inlines.Add(runNumerals);
par.Inlines.Add(new LineBreak());
par.Inlines.Add(new LineBreak());
par.Inlines.Add(runFractions);
par.TextAlignment = TextAlignment.Left;
par.FontSize = 18;
par.FontFamily = new FontFamily("Palatino Linotype");
par.Typography.NumeralStyle = FontNumeralStyle.OldStyle;
par.Typography.Fraction = FontFraction.Stacked;
par.Typography.Variants = FontVariants.Inferior;
Dim par As New Paragraph()
Dim runText As New Run("This text has some altered typography characteristics. Note" & "that use of an open type font is necessary for most typographic" & "properties to be effective.")
Dim runNumerals As New Run("0123456789 10 11 12 13")
Dim runFractions As New Run("1/2 2/3 3/4")
par.Inlines.Add(runText)
par.Inlines.Add(New LineBreak())
par.Inlines.Add(New LineBreak())
par.Inlines.Add(runNumerals)
par.Inlines.Add(New LineBreak())
par.Inlines.Add(New LineBreak())
par.Inlines.Add(runFractions)
par.TextAlignment = TextAlignment.Left
par.FontSize = 18
par.FontFamily = New FontFamily("Palatino Linotype")
par.Typography.NumeralStyle = FontNumeralStyle.OldStyle
par.Typography.Fraction = FontFraction.Stacked
par.Typography.Variants = FontVariants.Inferior
Tipografi hakkında daha fazla bilgi için bkz. WPF
Ayrıca bkz.
.NET Desktop feedback