مشاركة عبر


نظرة عامة على مستند التدفق

تم تصميم مستندات التدفق لتحسين العرض و ‏‫إمكانية القراءة. بدلاً من أن يتم تعيينها بتخطيط واحد معرّف مسبقاً ، فإن مستندات التدفق تضبط و تعيد تدفق محتوياتها بشكل حيوي استناداً إلى متغيرات وقت التشغيل مثل حجم النافذة و دقة الجهاز وتفضيلات المستخدم الاختيارية. بالإضافة إلى ذلك، تدفق المستندات يقدم ميزات مستند متقدمة، مثل فصل الصفحات والأعمدة. يوفر هذا الموضوع نظرة عامة حول تدفق المستندات وكيفية إنشائها.

يشتمل هذا الموضوع على الأقسام التالية.

  • ما هو مستند التدفق
  • أنواع مستندات التدفق
  • إنشاء محتوى تدفق
  • فئات التدفق المترابط
  • محتوى مخطط:
  • تخصيص نص
  • موضوعات ذات صلة

ما هو مستند التدفق

تم تصميم مستند التدفق ل"يعيد تدفق المحتوى" بناءً على حجم النافذة و دقة الجهاز ومتغيرات البيئة الأخرى. بالإضافة إلى ذلك، تحتوي مستندات التدفق على عدداً من الميزات المضمنة بما في ذلك البحث ، أوضاع العرض التى تؤدى إلي أمثلية قابلية القراءة والقدرة على تغيير حجم الخطوط ومظهرها. مستندات التدفق تستخدم بشكل أفضل عندما تكون سهولة القراءة هي مستند استهلاك السيناريو الأساسي. وفي المقابل،تم تصميم المستندات الثابتة ليكون لها عرض تقديمي ثابت. المستندات الثابتة تكون مفيدة عندما يكون دقة محتوى المصدر أساسية. راجع المستندات فى WPF للحصول على مزيد من المعلومات حول أنواع مختلفة من المستندات.

يبين الرسم التوضيحي التالي نموذج لمستند التدفق المعروض في عدة إطارات ذات أحجام مختلفة. كما تتغير مساحة العرض، يتم اعادة تدفق المحتوى لجعل استخدام المساحة المتوفرة أفضل استخدام.

إعادة تدفق محتوى مستند التدفق

كما هو موضح في الصورة أعلاه، تدفق المحتوى يمكن أن يتضمن العديد من المكونات بما في ذلك فقرات وقوائم و صور و أكثر. هذه المكونات تتوافق مع عناصر في العلامات و كائنات في التعليمات البرمجية الإجرائية. سنناقش هذه الفئات بالتفصيل لاحقاً في فئات التدفق المترابط مقطعمن هذه النظرة العامة. الآن، ها هو مثال بسيط لتعليمة برمجية تقوم بإنشاء مستند التدفق يتكون من فقرة مع بعض نص غامق وقائمة.

<!-- This simple flow document includes a paragraph with some
     bold text in it and a list. -->
<FlowDocumentReader xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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>

Imports System
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
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;
        }
    }
}

يبين الرسم التوضيحي أدناه الذي تبدو عليه هذه التعليمات البرمجية المتكررة.

لقطة الشاشة: مثال لـ FlowDocument المعروض

في هذا المثال، عنصر التحكم FlowDocumentReader استخدم لاستضافة محتوى التدفق. راجع أنواع مستند التدفق للحصول على مزيد من المعلومات حول تدفق محتوى استضافة عناصر التحكم. Paragraph ،List ،ListItem ، وعناصرBold يتم استخدامها للتحكم في تنسيق المحتوى، استناداً إلى ترتيبها في العلامات. على سبيل المثال، العنصرBold يمتد فقط عبر جزء من النص في الفقرة ،نتيجة لذلك ، ذلك الجزء فقط من النص غامق. في حالة انك قمت باستخدام HTML ،سيكون هذا مألوفا لك.

كما مميز في الرسم التوضيحي أعلاه، هناك العديد من الميزات المضمنة في مستندات التدفق:

  • البحث: يسمح للمستخدم بإجراء بحث نصي كامل من مستند بأكمله.

  • وضع العرض: يمكن للمستخدم تحديد وضع عرض المفضل له بما في ذلك وضع عرض صفحة-واحدة (صفحة-في-كل-مرة) و وضع عرض اثنين-صفحة-في-كل-مرة (كتاب تنسيق القراءة) و وضع عرض التمرير المستمر (بلا أسفل). لمزيد من المعلومات حول أوضاع العرض هذه راجع FlowDocumentReaderViewingMode.

  • صفحة عناصر التحكم بالتنقل: إذا كان وضع عرض المستند يستخدم صفحات، عناصر تحكم التنقل بالصفحة تتضمن زر للانتقال إلى الصفحة التالية (السهم إلى الأسفل) أو إلى الصفحة السابقة (السهم إلى الأعلى) ، بالإضافة إلى مؤشرات رقم الصفحة الحالية و إجمالي عدد الصفحات. عكس خلال صفحات يمكن أيضاً أن يتم ذلك باستخدام مفاتيح أسهم لوحة المفاتيح.

  • تكبير/تصغير: عناصر تحكم التكبير/التصغير تمكن المستخدم من زيادة أو إنقاص مستوى التكبير/التصغير بالنقر فوق علامة الأزرار زائد أو ناقص، على التوالي. تتضمن عناصر تحكم التكبير/التصغير أيضاً شريط تمرير لضبط مستوى التكبير/التصغير. لمزيد من المعلومات، راجع Zoom.

يمكن تعديل هذه الميزات استناداً إلى عنصر تحكم يستخدم لاستضافة المحتوى المتدفق. يصف القسم التالي عناصر التحكم المختلفة.

أنواع مستندات التدفق

يتم عرض محتوى مستند التدفق و كيفية ظهوره تعتمد على الكائن الذي يُستخدم لاستضافة المحتوى المتدفق. هناك أربعة عناصر تحكم التي تعتمد على عرض محتوى التدفق: FlowDocumentReader و FlowDocumentPageViewer وRichTextBox و FlowDocumentScrollViewer. وتم وصف هذه المحتويات بإيجاز أدناه.

ملاحظة: FlowDocumentهو مطلوب لاستضافة محتوى التدفق مباشرة، بحيث كافة هذه عروض عناصر التحكم تستهلكFlowDocument لتمكين استضافة محتوى التدفق.

FlowDocumentReader

يتضمّن FlowDocumentReader ميزات تمكن المستخدم بشكل حيوي من الاختيار بين أوضاع العرض المختلفة, بما فيها وضع عرض صفحة واحدة (صفحة - فى -كل - مرة)، وضع عرض اثنين - صفحة - في -كل - مرة (كتاب تنسيق القراءة) ،و وضع عرض التمرير المستمر (بلا أسفل) . لمزيد من المعلومات حول أوضاع العرض هذه راجع FlowDocumentReaderViewingMode. إذا لم تكن بحاجة إلى القدرة على التبديل بين أوضاع العرض المختلفة بشكل حيوي، يوفر FlowDocumentPageViewer و FlowDocumentScrollViewer عارضي محتوى تدفق أخف وزناً التي تم تثبيتها على وضع عرض معين.

FlowDocumentPageViewer و FlowDocumentScrollViewer

يعرض FlowDocumentPageViewer المحتوى في وضع عرض صفحة-فى-كل-مرة، بينما FlowDocumentScrollViewer يظهر المحتوى في وضع التمرير المستمر. كلاFlowDocumentPageViewer و FlowDocumentScrollViewer تم تثبيتهما على وضع عرض معين. مقارنة ب FlowDocumentReader ، الذي يتضمن ميزات تمكّن المستخدم من الاختيار بشكل حيوي بين أوضاع العرض المختلفة (كما تم توفيره من قبل التعداد FlowDocumentReaderViewingMode ) ، على حساب كونه من مورد كبير اكثر من FlowDocumentPageViewer أو FlowDocumentScrollViewer.

بشكل افتراضي، يتم دائماً إظهار شريط تمرير عمودي، و شريط تمرير أفقي يصبح مرئي إذا لزم الأمر. الUI الافتراضي لFlowDocumentScrollViewer لا يحتوى على شريط أدوات، ومع ذلك، الخاصية IsToolBarVisible يمكن استخدامها لتمكين شريط الأدوات المتضمن.

RichTextBox

قم باستخدام RichTextBox عندما ترغب أن تسمح للمستخدم أن يحرر محتوى تدفق. على سبيل المثال، إذا أردت إنشاء محرر الذي يسمح للمستخدم معالجة أشياء مثل الجداول و تنسيقات المائل و الغامق و إلخ، يمكنك استخدام RichTextBox. لمزيد من المعلومات، راجع نظرة عامة على RichTextBox.

**ملاحظة:**محتوى التدفق داخل RichTextBox لا يسلك تماماً مثل محتوى التدفق المضمن في عناصر التحكم الأخرى. على سبيل المثال، هناك أعمدة في RichTextBox وبالتالي لا يوجد تلقائيا سلوك تغيير الحجم. أيضاً، عادةً الميزات المضمنة لمحتوى التدفق مثل البحث و وضع عرض و التنقل بين الصفحات والتكبير/التصغير غير متوفرة داخل RichTextBox.

إنشاء محتوى تدفق

يمكن أن يكون محتوى تدفق معقد ، يتألف من عناصر متعددة بما في ذلك نص و صور و جداول و حتى فئات مشتقة UIElement مثل عناصر التحكم. لفهم كيفية إنشاء محتوى تدفق معقد، هذه النقاط التالية حرجة:

  • فئات التدفق المترابط: كل فئة مستخدمة في محتوى تدفق لها غرض محدد. بالإضافة إلى ذلك، العلاقة الهيكلية بين فئات التدفق تساعدك على فهم كيفية استخدامها. على سبيل المثال،الفئات المشتقة من فئة Block تستخدام لاحتواء كائنات أخرى في حين أن الفئات المشتقة من Inline تحتوي على الكائنات التي تم عرضها.

  • محتوى مخطط: مستند تدفق يمكن أن يتطلب عدد حقيقي من العناصر المتداخلة. يحدد محتوى المخطط علاقات الأصل/التابع الممكنة بين العناصر.

المقاطع التالية ستتجاوز كل من هذه المناطق بمزيد من التفاصيل.

فئات التدفق المترابط

يُظهر الرسم التخطيطي أدناه الكائنات الأكثر استخداما عادةً مع محتوى تدفق:

الرسم التخطيطي: التسلسل الهيكلي لفئة عنصر محتوى مرن

لأغراض تدفق محتوى، هناك فئتين هامتين:

  1. كنلة-الفئات المشتقة : تدعى أيضاً "كنلة محتوى العناصر'' أو فقط" كتلة عناصر". العناصر التي ترث من Block يمكن استخدامها لتجميع العناصر ضمن أصل شائع أو لتطبيق سمات شائعة الى مجموعة.

  2. ‏‫مُضمن‬-الفئات المشتقة: تدعى أيضاً "‏‫مُضمن محتوى عناصر" أو فقط "مُضمن عناصر". العناصر التي ترث من Inlineتكون إما موجودة داخل عنصر كتلة أو عنصر آخر مُضمن. يتم غالبًا استخدام "العناصر المضمنة" كالحاوية المباشرة من المحتوى المعروض على الشاشة. على سبيل المثال، ‎ (عنصر كتلة) Paragraphالذي يمكن أن يحتوي ‎ (عنصر مُضمن) Run ولكن ال Run فعلياً يحتوي على النص المعروض على الشاشة.

يتم وصف كل فئة في هاتين الفئتين بإيجاز أدناه.

كنلة-الفئات المشتقة :

فقرة

Paragraph يستخدم عادة لتجميع محتوى في فقرة. إن أبسط استخدام و الأكثر شيوعاً لفقرة هو إنشاء فقرة نصية.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <Paragraph>
    Some paragraph text.
  </Paragraph>
</FlowDocument>

Imports System
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
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;
        }
    }
}

ومع ذلك، يمكنك أن تحتوي أيضاً على بعض مضمن عناصر-مشتقة أخرى كما ستشاهد أدناه.

القسم

Section يُستخدم فقط ليحتوي العناصر المشتقة الأخرىBlock. لا يتم تطبيق أي تنسيق افتراضي للعناصر التي يحتوي عليها. ومع ذلك، أي قيم خصائص تقوم بتعيينها على Section تنطبق على عناصرها التابعة. مقطع أيضا من إلى يكرر برمجياً من خلال مجموعة تابعة لها. Sectionهو استخدامها بطريقة مشابهة للعلامة <DIV> في HTML.

في المثال أدناه، يتم تعريف ثلاث فقرات ضمن واحد Section. يحتوي المقطع على قيمة خاصية حمراء Background، وبالتالي لون خلفية الفقرات هي أيضاً حمراء.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

Imports System
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
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;
        }
    }
}

BlockUIContainer

BlockUIContainerE nablEsUIElementعناصر (i.E. Button) إلى يمكن تضمينها في محتوى مشتق من حظر التدفق. InlineUIContainer(see below) هو يستخدم لتضمينUIElementعناصر في المضمنة-اشتقاق تدفق محتوى. BlockUIContainer and InlineUIContainer are important because there is no other way to use a UIElement in flow content unless it is contained within one of these two elements.

المثال التالي يوضح كيفية استخدام العنصر BlockUIContainerلاستضافة كائنات UIElement داخل محتوى تدفق.

<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>

يظهر الشكل التالي كيف يعرض هذا المثال.

لقطة الشاشة: UIElement مضمن في محتوى التدفق

قائمة

List يُستخدم لإنشاء تعداد نقطي أو قائمة رقمية. قم بتعيين الخاصية MarkerStyleإلى TextMarkerStyle قيمة قائمة تعداد لتحديد نمط القائمة. المثال التالي يوضح كيفية إنشاء قائمة بسيطة.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

Imports System
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
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;
        }
    }
}

ملاحظة:  Listهو عنصر التدفق الوحيد الذي يستخدم الListItemCollection لإدارة عناصر تابعة.

جدول

Tableهو المستخدمة لإنشاء الجدول. Tableهو مماثلةGridالعنصر ولكن لديه قدرات أكثر ولذلك، يتطلب زائد عن الحد مورد أكبر. لأن Grid هو UIElement ، لا يمكن استخدامه في محتوى تدفق ما لم يكن متضمنا في BlockUIContainer أو InlineUIContainer. لمزيد من المعلومات حول Table راجع نظرة عامة حول الجدول.

‏‫مُضمن‬-الفئات المشتقة:

Run

Run يُستخدم ليحتوي على نص غير منسق. قد تتوقع كائنات Run تستخدم بشكل مكثف في محتوى تدفق. ولكن، في ترميز، Runعناصر غير مطلوبة إلى يمكن استخدامها بشكل صريح. Runهو المطلوب استخدامها عند إنشاء أو التعامل مع تدفق مستندات باستخدام تعليمات برمجية. على سبيل المثال، في العلامات أدناه، الأول Paragraph يعيّن العنصر Run بشكل صريح أثناء الثاني لا. كلا الفقرات ينشيء إخراج متطابق.

<Paragraph>
  <Run>Paragraph that explicitly uses the Run element.</Run>
</Paragraph>

<Paragraph>
  This Paragraph omits the the Run element in markup. It renders
  the same as a Paragraph with Run used explicitly. 
</Paragraph>

ملاحظة: بدء تشغيل في ال .NET Framework 4 ، الخاصية Text من الكائن Runهي خاصية تبعية. يمكنك ربط الخاصية Text إلى مصدر بيانات، مثل TextBlock. الخاصية Text تدعم بشكل كامل أحادية اتجاه الربط. الخاصيةText تدعم أيضاً الربط ثنائي الاتجاه، عدا ل RichTextBox. على سبيل المثال ، راجع Run.Text.

امتداد

Span يجمع محتويات العناصر المضمنة الأخرى معاً. ليس تقديم تورث يتم تطبيقه على المحتوى داخل عنصر Span. ‏‫على الرغم من ذلك، العناصر التي ترث من Span بما في ذلك Hyperlink و Bold وItalic و Underline تطبق تنسيق على نص.

يوجد أدناه مثال على Span المستخدمة لتحتوي على محتوى مضمنة بما في ذلك نص، عنصر Bold و Button.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

تُظهر اللقطة التالية كيف يعرض هذا المثال.

لقطة الشاشة: مثال للنطاق المعروض

InlineUIContainer

InlineUIContainerE nablEsUIElementعناصر (i.E. عنصر تحكم مثل Button) إلى يمكن تضمينها في Inlineمحتوى العنصر. هذا العنصر هو المكافئ المضمن ل BlockUIContainer الموضحة أعلاه. يوجد أدناه مثال يستخدم InlineUIContainer ‏‫لإدراج‬ Button مضمنة في Paragraph.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

Imports System
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
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;
        }
    }
}

ملاحظة: InlineUIContainer لا يحتاج أن يتم استخدامه بشكل صريح في العلامات. إذا حذفته ،سيتم إنشاء InlineUIContainer على أية حال عند ترجمة التعليمات البرمجية.

رسم توضيحي و شكل عائم

Figure and Floater are used to embed content in Flow Documents with placement properties that can be customized independent of the primary content flow. FigureorFloaterعناصر تستخدم غالباً لتمييز أو إبراز أجزاء من المحتوى، إلى مضيف الدعم الصور أو المحتويات الأخرى في تدفق المحتوى الرئيسي، أو إدخال المتصلة المتعلقة المحتوى مثل كـ إعلانات.

يظهر المثال التالي كيفية تضمين Figure إلى فقرة من نص.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

Imports System
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
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;
        }
    }
}

يبين الرسم التوضيحي التالي كيف يعرض هذا المثال.

لقطة الشاشة: مثال لرسم التوضيحي

Figure وFloater تختلف بعدة طرق ثم يتم استخدامها من أجل وحدات سيناريو مختلفة.

شكل:

  • يمكن وضعه: يمكنك تعيين نقاطه الارتكازية الأفقية والرأسية لإرتكازه نسبيا مع الصفحة أو المحتوى أو العمود أو الفقرة. يمكنك أيضاً استخدام خصائصه HorizontalOffset و VerticalOffset لتحديد إزاحات عشوائية.

  • هو متغير الحجم الى أكثر من عمود: يمكنك تعيين ارتفاع وعرض Figureالى مضاعفات صفحة أو محتوى أو ارتفاع أو عرض عمود. لاحظ أنه في حالة الصفحة و المحتوى ، مضاعفات أكبر من 1 غير مسموح بها. على سبيل المثال، يمكنك تعيين عرض Figure لتكون "0.5 صفحة" أو "0.25 محتوى"أو"2 عمود". يمكنك أيضاً تعيين الارتفاع والعرض الى قيم بكسل مطلقة.

  • لا تقوم بإعادة تعيين فواصل الصفحات: إذا كان المحتوى داخل Figure لا يلائم داخل الFigure ، سوف يعرض أيا كان عدم احتواء المحتوى وفقدان المحتوى المتبقي.

شكل عائم‬:

  • لا يمكن وضعه وسوف يعرض حيثما يمكن أن توفر له مساحة. لا يمكن تعيين الإزاحة أو الارتساء Floater.

  • لا يمكن تغيير حجمه الى أكثر من عمود: افتراضياً، Floater‏‫يجري تغيير الحجم الى‬ عمود واحد. يحتوي على خاصية Widthالتي يمكن تعيينها إلى قيمة بكسل مطلق ولكن إذا كانت هذه القيمة أكبر من عرض عمود واحد يتم تجاهلها ويتم تغيير حجم الشكل العائم في عمود واحد. يمكنك تغيير حجم هذا إلى أصغر من من عمود واحد بتعيين العرض بالبكسل الصحيح، ولكن التحجيم هو غير عمود خاص، حيث "0.5Column" هو لا يعد تعبيراً صالحاً ل Floaterالعرض. Floaterلا تحتوي تشغيل ارتفاع خاصية و لا يمكن تعيين الارتفاع الخاص به، ويعتمد ارتفاع الخاص به تشغيل المحتوى

  • Floater يقوم بإعادة تعيين فواصل الصفحات: إذا امتد المحتوى عند عرضه المحدد الى أكثر من ‏‫ارتفاع‬ عمود واحد ،الشكل العائم يفصل ويقوم بإعادة تعيين فواصل الصفحات الى العمود التالي أو الصفحة التالية أو الخ.

Figureهو جيد ووضع لوضع محتوى مستقل بحيث يمكنك التحكم في الحجم والموضع، وتكون واثقاً من أن المحتوى احتواؤه في حجم معين. Floaterهو مكاناً جيدا لوضع المزيد من تدفق تحرير المحتوى تتدفق مشابهة لمحتوى الصفحة الرئيسية، ولكن هو منفصلاً عن it.

LineBreak

LineBreak يسبب خط فاصل ليحدث في محتوى تدفق. يوضح المثال التالي استخدام LineBreak.

<FlowDocument xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

تُظهر اللقطة التالية كيف يعرض هذا المثال.

لقطة الشاشة: مثال لـ LineBreak

تدفق مجموعة عناصر

في العديد من الأمثلة أعلاه ، ال BlockCollection و InlineCollection تستخدم لإنشاء محتوى تدفق برمجياً. على سبيل المثال، لاضافر عناصر الى Paragraph ، يمكنك استخدام بناء الجملة:

myParagraph.Inlines.Add(new Run("Some text"));

يؤدي هذا إلى إضافة Run الى ال InlineCollection من ال Paragraph. هذا هو نفس الضمني Runالذي تم العثور عليه داخل Paragraph في علامات:

<Paragraph>

Some Text

</Paragraph>

كمثال لاستخدام ال BlockCollection يقوم المثال التالي بإنشاء Sectionجديد ثم يستخدم أسلوب الاضافة لإضافة Paragraphجديد الى المحتويات Section.

            Dim secx As New Section()
            secx.Blocks.Add(New Paragraph(New Run("A bit of text content...")))
Section secx = new Section();
secx.Blocks.Add(new Paragraph(new Run("A bit of text content...")));

بالإضافة إلى إضافة عناصر الى مجموعة تدفق ، يمكنك إزالة العناصر أيضاً. يقوم المثال التالي بحذف آخر عنصر Inline في الSpan.

            spanx.Inlines.Remove(spanx.Inlines.LastInline)
spanx.Inlines.Remove(spanx.Inlines.LastInline);

يقوم المثال التالي بمسح كافة محتويات ( Inline عناصر) من Span.

            spanx.Inlines.Clear()
spanx.Inlines.Clear();

عند العمل مع محتوى تدفق برمجياً ،على الأرجح سوف تقوم باستخدام هذه المجموعات بصورة مكثفة.

إذا كان عنصر تدفق يستخدم InlineCollection (Inlines) أو BlockCollection (كتل) لتحتوي على العناصر التابعة لها يعتمد على نوع العناصر التابعة ( Block أو Inline) يمكن تضمينها بواسطة الأصل. قواعد الاحتواء لتدفق محتوى عناصر تم تلخيصها في محتوى المخطط في المقطع التالي.

ملاحظة: هناك نوع ثالث من استخدام مجموعة مع محتوى تدفق ، ال ListItemCollection ، ولكن يتم استخدام هذه المجموعة فقط مع List. بالإضافة إلى ذلك، هناك عدة مجموعات تستخدم معTable. لمزيد من المعلومات، راجع نظرة عامة حول الجدول.

محتوى مخطط:

محدد عدد عناصر محتوى التدفق المختلفة, يمكن أن يكون المزعج التمكن من تعقّب نوع العناصر التابعة التي يمكن على عنصر أن يحتوي عليها. المخطط‬ أدناه يلخص قواعد الاحتواء لعناصر التدفق. تمثل الأسهم العلاقات المحتملة أصل/تابع.

الرسم التخطيطي: مخطط احتواء محتوى مرن

كما يمكن مشاهدة من المخطط أعلاه, التوابع المسموح بها لعنصر ليس بالضرورة تحديدها ما إذا كان عنصر Block أو عنصر Inline. على سبيل المثال، Span (عنصر Inline ) يمكن أن يكون لديه عناصر تابعة Inline فقط أثناء أن Figure (أيضاً عنصر Inline ) يمكن أن يكون لديه عناصر تابعة Block فقط. لذلك، المخطط هو مفيد لسرعة تحديد أي عنصر يمكن تضمينه في آخر. كمثال ، لنقوم باستخدام المخطط لتحديد كيفية إنشاء محتوى التدفق ل RichTextBox.

**1.**A RichTextBox يجب أن يحتوي على FlowDocument الذي يجب أن تحتوي بدورها على اشتقاق كائن-Block. أدناه يوجد مقطع المطابقة من المخطط أعلاه.

الرسم التخطيطي: قواعد احتواء RichTextBox

وبالتالي الآن، هذا ما قد تبدو العلامات.

<RichTextBox>
  <FlowDocument>
    <!-- One or more Block-derived object… -->
  </FlowDocument>
</RichTextBox>

2. وفقا الى المخطط، هناك عدة عناصر Block لاختيار بما في ذلك Paragraph و Section و Table و List ، و BlockUIContainer (انظر كتلة-فئات مشتقة أعلاه). لنقول اننا نريد Table. طبقًا للمخطط الموجود أعلاه, Table يحتوي على TableRowGroup يحتوي على عناصر TableRow التي تحتوي على عناصر TableCell التي تحتوي على كائنات مشتقة-Block. أدناه يوجد القطعة المطابقة ل Tableالمأخوذة من المخطط الموجود أعلاه.

الرسم التخطيطي: المخطط الأصلي/التابع للجدول

يوجد أدناه العلامات المطابقة.

<RichTextBox>
  <FlowDocument>
    <Table>
      <TableRowGroup>
        <TableRow>
          <TableCell>
            <!-- One or more Block-derived object… -->
          </TableCell>
        </TableRow>
      </TableRowGroup>
    </Table>
  </FlowDocument>
</RichTextBox>

3. مرة أخرى,واحد أو أكثر من عنصر Block مطلوب أسفل TableCell. لجعله بسيط ، لنقم بوضع بعض النص داخل الخلية. يمكننا القيام بذلك باستخدام Paragraph مع عنصر Run. أدناه هي المقاطع المطابقة من المخطط المظهرة انه Paragraph يمكن أن تأخذ Inline عنصر وأن Run ( عنصر Inline ) فقط يأخذ النص العادي.

الرسم التخطيطي: المخطط الأصلي/التابع للفقرةالرسم التخطيطي: المخطط الأصلي/التابع للتشغيل

يوجد أدناه مثال بأكمله في العلامات.

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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>

تخصيص نص

عادة ما يكون النص هو النوع الأكثر شيوعا لمحتوى في مستند تدفق. على الرغم من أنه يمكن استخدام الكائنات المقدمة أعلاه للتحكم بمعظم أوجه كيفية تقديم النص ، توجد بعض الطرق الأخرى لتخصيص النص الذي تم تغطيته في هذا المقطع.

زخرفة النص

زخرفة النص تمكنك من تطبيق تأثيرات لخط تحتي وخط فوقي و الأساس و يتوسطه خط يؤثر على النص (راجع الصور أدناه). تتم إضافة هذه الزخرفات باستخدام الخاصية TextDecorationsالتي تعرض بواسطة عدد من الكائنات بما في ذلك Inline و Paragraph و TextBlock ، و TextBox.

المثال التالي يوضح كيفية تعيين خاصية TextDecorationsParagraph.

<FlowDocument ColumnWidth="200">
  <Paragraph TextDecorations="Strikethrough">
    This text will render with the strikethrough effect.
  </Paragraph>
</FlowDocument>
                Dim parx As New Paragraph(New Run("This text will render with the strikethrough effect."))
                parx.TextDecorations = TextDecorations.Strikethrough
Paragraph parx = new Paragraph(new Run("This text will render with the strikethrough effect."));
parx.TextDecorations = TextDecorations.Strikethrough;

يظهر الشكل التالي كيف يعرض هذا المثال.

لقطة الشاشة: نص به تأثير الخطوط المتوسطة الافتراضي

تظهر الرسومات التوضيحية التالية كيفية خط علويو الأساسوخط سفلي تقديم زخرفات ، على التوالي.

لقطة الشاشة: TextDecorator لخط فوقيلقطة الشاشة: تأثير الخط الأساسي الافتراضي على النصلقطة الشاشة: نص به تأثير تسطير افتراضي

أسلوب الطباعة

الخاصية Typography مكشوفة بأكثرمحتوى تدفق متعلق يتضمن TextElement و FlowDocument و TextBlock ، و TextBox. Th هو خاصية هو المستخدمة للتحكم characterهوtics/variations طباعة نص (على سبيل المثال: أحرف استهلالية صغيرة أو قطر أيمن متوسط، مما يجعل مرتفع و منخفض، الخ).

يوضح المثال التالي كيفية تعيين سمة Typography باستخدام Paragraph كـعنصر المثال.

<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>

يظهر الشكل التالي كيف يعرض هذا المثال.

لقطة الشاشة: نص بأسلوب طباعة متغير

وفي المقابل، يظهر الشكل التالي كيفية عرض مثال مشابه ذو خصائص مطبعية افتراضية.

لقطة الشاشة: نص بأسلوب طباعة متغير

يظهر المثال التالي كيفية تعيين خاصية Typography برمجياً.

            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
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;

راجع أسلوب الطباعة في WPF للحصول على مزيد من المعلومات حول أسلوب الطباعة.

راجع أيضًا:

المبادئ

أمثلية الأداء: Text

أسلوب الطباعة في WPF

نظرة عامة على طراز محتوى عنصر النص.

نظرة عامة على RichTextBox

المستندات فى WPF

نظرة عامة حول الجدول

نظرة عامة حول التعليقات التوضيحية

موارد أخرى

مواضيع إجراءات عناصر تدفق المحتوى