مشاركة عبر


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

WPF يتضمن دعم العرض التقديمي لمحتوى النص خلال استخدام ميزة اثراءواجهة المستخدم (UI) عناصر التحكم. بشكل عام يمكنك تقسيم عرض النص الى ثلاث طبقات:

  1. باستخدام Glyphs و كائناتGlyphRun مباشرة.

  2. باستخدام كائن FormattedText.

  3. باستخدام عناصر تحكم عالية-المستوى مثل TextBlock و كائنات FlowDocument .

يوفر هذا الموضوع توصيات لأداء عرض النص.

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

  • عرض النص في مستوى الصورة الرمزية
  • كائن FormattedText
  • FlowDocument و TextBlock و عناصر التحكم
  • الارتباط التشعبي
  • مميزات تنسيق النص
  • موضوعات ذات صلة

عرض النص في مستوى الصورة الرمزية

Windows Presentation Foundation (WPF) توفر دعم النص متقدم بما في ذلك علامات مستوى الصورة الرمزية مع الوصول مباشرة إلىGlyphs للعملاء الذين يريدون الاعتراض واستمرار النص بعد تهيئة. توفر هذه الميزات دعم هام لمتطلبات تقديم النص المختلفة في كل من وحدات السيناريو التالية.

  • شاشة عرض لمستندات التنسيق الثابت .

  • طباعة السيناريوهات.

    • Extensible Application Markup Language (XAML) كلغة لجهاز الطابعة.

    • Microsoft XPS Document Writer.

    • برامج تشغيل الطابعة السابقة ، المخرجات من تطبيقات Win32 إلى تنسيق ثابت.

    • تنسيق التخزين المؤقت للطباعة.

  • تمثيل مستند التنسيق الثابت بما في ذلك عملاء الإصدارات السابقة من Windowsو اجهزة الحوسبة الأخرى.

ملاحظةملاحظة

GlyphsوGlyphRunمصممة للعرض التقديمي تنسيق مستند و طباعة سيناريوهات.Windows Presentation Foundation (WPF) provides several elements for general layout and واجهة المستخدم (UI) scenarios such as Label and TextBlock.للحصول على مزيد من المعلومات حول التخطيط و سيناريوهات واجهة المستخدم ، راجع أسلوب الطباعة في WPF.

تبين الأمثلة التالية كيف يتم تعريف خصائص كائن Glyphs فى Extensible Application Markup Language (XAML). يمثل كائن Glyphs الناتج من GlyphRun في XAML. تفترض الأمثلة أن الخطوط Arial Courier New و Times New Roman مثبتة في مجلد C:\WINDOWS\Fonts على الكمبيوتر.

<!-- The example shows how to use a Glyphs object. -->
<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >

   <StackPanel Background="PowderBlue">

      <Glyphs
         FontUri             = "C:\WINDOWS\Fonts\TIMES.TTF"
         FontRenderingEmSize = "100"
         StyleSimulations    = "BoldSimulation"
         UnicodeString       = "Hello World!"
         Fill                = "Black"
         OriginX             = "100"
         OriginY             = "200"
      />

   </StackPanel>
</Page>

باستخدام DrawGlyphRun

إذا كان لديك عناصر تحكم مخصصة وكنت تريد تقديم رموزًا, استخدم أسلوبDrawGlyphRun.

توفرWPF أيضاً خدمات ذات مستوى أقل باستخدام تنسيق النص المخصص من خلال استخدام الكائنFormattedText. الطريقة الأكثر كفاءة لتقديم نص في Windows Presentation Foundation (WPF) هى عن طريق إنشاء محتوى نص في مستوى الصورة الرمزية باستخدام Glyphs و GlyphRun. ومع ذلك، تكلفة هذه الكفاءة هى فقدان سهولة استخدام تنسيق النص الغنى ، والتي هي مميزات مضمنة لعناصر التحكم Windows Presentation Foundation (WPF) مثل TextBlock و FlowDocument.

كائن FormattedText

FormattedText يسمح لك هذا الكائن برسم نص متعدد الأسطر فيه كل حرف في النص يمكن أن يُنسق بشكل فردي. لمزيد من المعلومات، راجع رسم نص منسق.

لإنشاء نص منسق ، قم باستدعاء FormattedText مُنشئ لإنشاء FormattedText الكائن. بمجرد إنشاء سلسلة النص المنسق الأولي يمكنك تطبيق نطاق من أنماط التنسيق. إذا أراد التطبيق الخاص بك تطبيق التخطيط الخاصة به، ثم كان الكائنFormattedText هو اختيار أفضل من استخدام عنصر تحكم مثل TextBlock. للحصول على مزيد من المعلومات حول كائن FormattedText, راجع رسم نص منسق.

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

ينشئ المثال التعليمات البرمجية التالية كائن FormattedText ثم يعرضه.

        Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext)
            Dim testString As String = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor"

            ' Create the initial formatted text string.
            Dim formattedText As New FormattedText(testString, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, New Typeface("Verdana"), 32, Brushes.Black)

            ' Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
            formattedText.MaxTextWidth = 300
            formattedText.MaxTextHeight = 240

            ' Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
            ' The font size is calculated in terms of points -- not as device-independent pixels.
            formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5)

            ' Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
            formattedText.SetFontWeight(FontWeights.Bold, 6, 11)

            ' Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
            formattedText.SetForegroundBrush(New LinearGradientBrush(Colors.Orange, Colors.Teal, 90.0), 6, 11)

            ' Use an Italic font style beginning at the 28th character and continuing for 28 characters.
            formattedText.SetFontStyle(FontStyles.Italic, 28, 28)

            ' Draw the formatted text string to the DrawingContext of the control.
            drawingContext.DrawText(formattedText, New Point(10, 0))
        End Sub
protected override void OnRender(DrawingContext drawingContext)
{
    string testString = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor";

    // Create the initial formatted text string.
    FormattedText formattedText = new FormattedText(
        testString,
        CultureInfo.GetCultureInfo("en-us"),
        FlowDirection.LeftToRight,
        new Typeface("Verdana"),
        32,
        Brushes.Black);

    // Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
    formattedText.MaxTextWidth = 300;
    formattedText.MaxTextHeight = 240;

    // Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
    // The font size is calculated in terms of points -- not as device-independent pixels.
    formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);

    // Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
    formattedText.SetFontWeight(FontWeights.Bold, 6, 11);

    // Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
    formattedText.SetForegroundBrush(
                            new LinearGradientBrush(
                            Colors.Orange,
                            Colors.Teal,
                            90.0),
                            6, 11);

    // Use an Italic font style beginning at the 28th character and continuing for 28 characters.
    formattedText.SetFontStyle(FontStyles.Italic, 28, 28);

    // Draw the formatted text string to the DrawingContext of the control.
    drawingContext.DrawText(formattedText, new Point(10, 0));
}

FlowDocument و TextBlock و عناصر التحكم

WPF يحتوي على عناصر تحكم متعددة لرسم النص على الشاشة. كل عنصر تحكم يستهدف سيناريو مختلف و له قائمة الميزات والقيود الخاصة به.

يؤثر FlowDocument على الأداء أكثر من TextBlock "أو" التسمية

بشكل عام، TextBlockيجب أن يكون عنصر نص دعم محدود للاستخدام عند هو المطلوبة، مثل جملة مختصرة في واجهة المستخدم (UI). Labelيمكن استخدامها عند اعتماد نص أدنى هو المطلوبة. عنصر FlowDocument هو حاوية للمستندات القابلة لإعادة التدفق و التي تدعم العرض التقديمي لمنسق المحتوى ولذلك، يكون له تأثير أداء أكبر من استخدام TextBlock أو عناصر التحكم Label .

لمزيد من المعلومات حول FlowDocument راجع نظرة عامة على مستند التدفق.

تجنب استخدام TextBlock في FlowDocument

عنصرTextBlock مشتق من UIElement. عنصر Run مشتق من TextElement ، وهو أقل المكلفة من استخدام كائن UIElement المشتق . عند الإمكان، استخدم Run بدلاً من TextBlock لعرض محتوى النص في FlowDocument.

يوضح نموذج العلامات التالى طريقتان لإعداد محتوى النص داخل FlowDocument:

<FlowDocument>

  <!-- Text content within a Run (more efficient). -->
  <Paragraph>
    <Run>Line one</Run>
  </Paragraph>

  <!-- Text content within a TextBlock (less efficient). -->
  <Paragraph>
    <TextBlock>Line two</TextBlock>
  </Paragraph>

</FlowDocument>

تجنب استخدام تشغيل لتعيين خصائص النص

بشكل عام، باستخدام Run داخل TextBlock يتم بأداء أكبر من عدم استخدام صراحة كائن Run على الاطلاق. إذا كنت تستخدم Runلتعيين خصائص النص ، قم بتعيين هذه الخصائص الى TextBlock بدلاً من ذلك.

يوضح نموذج العلامات التالي هاتين الطريقتين لتعيين خصائص النص، في هذه الحالة، خاصية FontWeight:

<!-- Run is used to set text properties. -->
<TextBlock>
  <Run FontWeight="Bold">Hello, world</Run>
</TextBlock>

<!-- TextBlock is used to set text properties, which is more efficient. -->
<TextBlock FontWeight="Bold">
  Hello, world
</TextBlock>

يعرض الجدول التالي تكلفة عرض 1000 كائن من TextBlock مع وبدون Runصريحة .

نوع TextBlock

وقت الإنشاء(بالملي ثانية)

وقت التقديم (بالملي ثانية)

تشغيل خصائص إعدادات النص

146

540

خصائص إعدادات النص TextBlock

43

453

تجنب ربط البيانات إلى خاصية Label.Content

تخيل سيناريو حيث لديك كائن Label و الذي يتم تحديثه بشكل متكرر من مصدر String. عند ربط البيانات لخاصية عنصر Label Content إلى الكائن المصدر String قد تواجه أداء رديئ. كل مرة يتم فبها تحديث مصدر String ، يتم إعادة إنشاء String صواب ويتم تجاهل جديد String القديم — لأن كائن String غير قابل للتغيير ، لا يمكن تعديلها. يؤدي هذا بدوره الىContentPresenter من الكائن Label لتجاهل محتواه القديم و إعادة إنشاء محتوى جديد لعرض Stringالجديدة.

حل هذه المشكلة أمر بسيط. إذا لم يتم إعدادLabel لقيمة ContentTemplate مخصصة ، استبدل Label ب TextBlock ثم ربط البيانات الخاصة به بخاصية Text إلى سلسلة المصدر.

خاصية ضم البيانات

تحديث الوقت(بالملى ثانية)

Label.Content

835

TextBlock.Text

242

الارتباط التشعبي

كائن Hyperlink هو عنصر محتوى تدفق مستوى مضمّن تسمح لك باستضافة الارتباطات التشعبية داخل محتوى التدفق.

دمج الارتباطات التشعبية في كائن TextBlock واحد

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

MSN الرئيسية | MSN الخاصة بي

يظهر مثال العلامات التالي عدة عناصر TextBlock المستخدمة لعرض الارتباطات التشعبية:

<!-- Hyperlinks in separate TextBlocks. -->
<TextBlock>
  <Hyperlink TextDecorations="None" NavigateUri="https://www.msn.com">MSN Home</Hyperlink>
</TextBlock>

<TextBlock Text=" | "/>

<TextBlock>
  <Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>
</TextBlock>

يظهر مثال العلامات التالى فهناك طريقة أكثر فعالية من عرض الارتباطات التشعبية في هذا الوقت باستخدام TextBlockواحد :

<!-- Hyperlinks combined in the same TextBlock. -->
<TextBlock>
  <Hyperlink TextDecorations="None" NavigateUri="https://www.msn.com">MSN Home</Hyperlink>

  <Run Text=" | " />

  <Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>
</TextBlock>

إظهار التسطير على الارتباطات التشعبية فقط على أحداث MouseEnter

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

الارتباط التشعبي التي تظهر على MouseEnter

الارتباطات التشعبية التي تعرض TextDecorations

يبين نموذج العلامات التالي Hyperlink معرّف مع وبدون تسطير:

<!-- Hyperlink with default underline. -->
<Hyperlink NavigateUri="https://www.msn.com">
  MSN Home
</Hyperlink>

<Run Text=" | " />

<!-- Hyperlink with no underline. -->
<Hyperlink Name="myHyperlink" TextDecorations="None"
           MouseEnter="OnMouseEnter"
           MouseLeave="OnMouseLeave"
           NavigateUri="https://www.msn.com">
  My MSN
</Hyperlink>

يعرض الجدول التالي التكلفة الأداء من عرض 1000 عنصر من Hyperlink مع وبدون تسطير.

الارتباط التشعبي

وقت الإنشاء(بالملي ثانية)

وقت التقديم (بالملي ثانية)

مع التسطير

289

1130

بدون تسطير

299

776

مميزات تنسيق النص

WPF يوفر تنسيق ثرى للنص, مثل الواصلة التلقائية. قد يؤثر أداء التطبيق فى هذه الخدماتو من ثم يجب استخدامه فقط عند الحاجة.

تجنب استخدام الواصلة غير الضروري

تطبيق الواصلة التلقائي يعثر على نقاط التوقف الواصلة لأسطر النص ويسمح لمواضع فصل إضافية للأسطر في TextBlock و كائنات FlowDocument. بشكل افتراضي، يتم تعطيل ميزة تطبيق الواصلة التلقائي في هذه الكائنات. يمكنك تمكين هذه الميزة بواسطة إعداد خاصية IsHyphenationEnabled الكائن إلى true. ومع ذلك، تمكين هذه الخاصية يؤدي WPF لبدء طراز كائن المكون (COM) إمكانية التشغيل المتداخل التي يمكن أن يؤثر على أداء التطبيق. من المستحسن عدم استخدام الواصلة التلقائية إلا إذا كنت تحتاج اليها.

استخدام الأشكال بعناية

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

الفقرة المثلى

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

راجع أيضًا:

المبادئ

تحسين أداء تطبيق WPF

التخطيط لأداء التطبيق

أمثلية الأداء: الاستفادة من الأجهزة

أمثلية الأداء: التصميم و التخطيط

أمثلية الأداء: الرسومات ثنائية الأبعاد و التصوير

أمثلية الأداء: سلوك كائن

أمثلية الأداء: موارد التطبيق

أمثلية الأداء: ربط البيانات.

أمثلية الأداء: توصيات أخرى

أدوات الأداء WPF و الموارد