hgمميزات ثنائية الاتجاه في النظرة العامة حول ال WPF

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

تشرح المقاطع التالية العديد من المميزات ثنائية الاتجاه مع الأمثلة لتوضيح كيفية تحقيق أفضل عرض للمحتوى ثنائي الاتجاه. معظم العينات تستخدم XAML ، من خلالها يمكنك بسهولة تطبيق المفاهيم على #C أو تعليمات Microsoft Visual Basic البرمجية.

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

  • FlowDirection
  • FlowDocument
  • عناصر النطاق
  • FlowDirection مع العناصر الغير نصية
  • استبدال الأرقام

FlowDirection

الخاصية الأساسية التي تعرف اتجاه تدفق المحتوى في تطبيق WPF FlowDirection. هذه الخاصية يمكن تعيينها بقيمة من قيمتين التعداد ، LeftToRight أو RightToLeft. تتوفر الخاصية لكافة عناصرWPF التي ترث من FrameworkElement.

تعين الأمثلة التالية اتجاه تدفق عنصر TextBox .

تدفق من اليسار إلى اليمين

<TextBlock Background="DarkBlue" Foreground="LightBlue" 
   FontSize="20" FlowDirection="LeftToRight">
        This is a left-to-right TextBlock
</TextBlock>

تدفق من اليمين إلى اليسار

<TextBlock Background="LightBlue" Foreground="DarkBlue"
   FontSize="20" FlowDirection="RightToLeft">
        This is a right-to-left TextBlock
</TextBlock>

يُظهر الرسم التالى كيف تعرض التعليمات البرمجية السابقة.

الرسومات التي توضح FlowDirection

محاذاة كتلة نص

عنصر داخل شجرة واجهة المستخدم (UI) سيرث FlowDirection من الحاوية الخاصة به. في المثال التالي TextBlock داخل Grid ، التي توجد في Window. إعداد FlowDirection لـ Window يتضمن إعداده لل Grid و TextBlock أيضاً.

يوضح المثال التالي إعداد FlowDirection.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="FlowDirectionApp.Window1"
    Title="BidiFeatures" Height="200" Width="700" 
    FlowDirection="RightToLeft">

    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Column="0" >
          This is a right-to-left TextBlock
      </TextBlock>

      <TextBlock Grid.Column="1" FlowDirection="LeftToRight">
          This is a left-to-right TextBlock
      </TextBlock>
    </Grid>
</Window>

المستوى الأعلى لـ Window يحتوي على RightToLeft FlowDirection، حتى تكون كافة العناصر الموجودة ضمنه ترث أيضاً نفس FlowDirection. ليتمكن عنصر من تجاوز FlowDirectionمحدد فإنه يجب أن يضيف تغيير اتجاه واضح مثل TextBlockالثاني في المثال السابق الذي يؤدي إلى تغيير LeftToRight. عندما لا يتم تعريفFlowDirection ،يطبق LeftToRightالافتراضي .

يظهر الرسم التالى إخراج المثال السابق.

الرسم الذي يوضح بشكل صريح FlowDirection المحدد

الرسم التوضيحي لاتجاه التدفق

FlowDocument

العديد من الأنظمة الأساسية للتطوير مثل HTML و Win32 و Java توفر دعم خاص لتطوير المحتوى ثنائي الاتجاه . لغات العلامات مثل HTML تعطى كتّاب المحتوى العلامات الضرورية لعرض النص في أي الاتجاه المطلوبةعلى سبيل المثال HTML 4.0 العلامة "dir" التي تأخذ "عربي " أو "لاتيني" كـ قيم. تشبه هذه العلامة خاصية FlowDirection ، ولكن خاصية FlowDirection تعمل بطريقة أكثر تقدماً لتخطيط المحتوى النصي كما يمكن استخدامه لمحتوى آخر غير نصي.

في WPF ، FlowDocument هو عنصر واجهة المستخدم متعدد المزايا يمكنك استضافة تركيبة من النصوص ، و الجداول، و الصور، وأي عناصر أخرى. العينات في المقاطع التالية تستخدم هذا العنصر.

إضافة نص إلى FlowDocument يمكن القيام به بأكثر من طريقة واحدة . طريقة بسيطة للقيام بذلك من خلال Paragraph وهو عنصرفى مستوى الحظر يستخدم لجمع محتوى مثل النص. إلى إضافة نص إلى موضعي-المستوى عناصر the ‏‫النماذج استخدم Span و Run. Span هو an موضعي-المستوى تدفق محتوى عنصر used for تجميع غير ذلك موضعي عناصر, while a Run هو an موضعي-المستوى تدفق محتوى عنصر intended إلى contain a تشغيل of unformatted نص. Span يمكن أن يحتوي على عدة عناصرRun .

يحتوي مثال المستند الأول على مستند يحتوي على عدد من الأسماء المشاركة بالشبكة; على سبيل المثال \\server1\folder\file.ext. إذا كان لديك ارتباط شبكة اتصال هذه في المستند بالعربية أو الانجليزية ، دوماً تريد أن تظهر بنفس الطريقة. يظهرالرسم التالى الارتباط في مستند RightToLeft بالعربية.

رسم يقوم بتوضيح استخدام العنصر الممتد

المستند المتدفق من اليمين إلى اليسار

لأن النص عبارة عن RightToLeft ، كافة الأحرف الخاصة, مثل “ \ ” ، تفصل النص في ترتيب من اليمين الى اليسار. ذلك يؤدي الى عدم إظهار الارتباط بالترتيب الصحيح، لذلك لحل المشكلة يجب تضمين النص للمحافظة على Run منفصلة لانسياب LeftToRight. بدلاً من الاضطرار إلى Runمنفصلة لكل لغة، طريقة أفضل لحل هذه المشكلة هى تضمين النص الإنكليزي الأقل استخداماً إلى Spanأكبر بالعربية .

فيما يلي رسم يوضّح ذلك.

رسم يقوم بتوضيح استخدام عنصر التشغيل المضمن في العنصر الممتد

لقطة شاشة لـ XamlPad

يوضح المثال التالي استخدام عناصر Run و Span في المستندات.

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    FlowDirection="RightToLeft">

  <FlowDocument>
    <Paragraph>
      <Span FlowDirection="RightToLeft" >
        ستجد الملف هنا:
        <Run FlowDirection="LeftToRight">
           \\server1\filename\filename1.txt</Run>
        ثم باقى النص!
      </Span>
    </Paragraph>
  </FlowDocument>
</Page>

عناصر النطاق

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

يوضح الرسم التالي اتجاه التدفق لعدة عناصرTextBlock.

الرسم الذي يوضح FlowDirection في عدة عناصر TextBlock

كتل نصية باتجاهات تدفق مختلفة

يوضح المثال التالي كيفية استخدام و عناصرSpan و Run لانتاج النتائج المعروضة في الرسم السابق

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <StackPanel >

    <TextBlock FontSize="20" FlowDirection="RightToLeft">
      <Run FlowDirection="LeftToRight">العالم</Run>
      <Run FlowDirection="LeftToRight" Foreground="Red" >فى سلام</Run>
    </TextBlock>

    <TextBlock FontSize="20" FlowDirection="LeftToRight">
      <Run FlowDirection="RightToLeft">العالم</Run>
      <Run FlowDirection="RightToLeft" Foreground="Red" >فى سلام</Run>
    </TextBlock>

    <TextBlock FontSize="20" Foreground="Blue">العالم فى سلام</TextBlock>

    <Separator/>

    <TextBlock FontSize="20" FlowDirection="RightToLeft">
      <Span Foreground="Red" FlowDirection="LeftToRight">Hello</Span>
      <Span FlowDirection="LeftToRight">World</Span>
    </TextBlock>

    <TextBlock FontSize="20" FlowDirection="LeftToRight">
      <Span Foreground="Red" FlowDirection="RightToLeft">Hello</Span>
      <Span FlowDirection="RightToLeft">World</Span>
    </TextBlock>

    <TextBlock FontSize="20" Foreground="Blue">Hello World</TextBlock>

  </StackPanel>

</Page>

في عناصرTextBlock في نموذج ، يتم تخطيط عناصر Span طبقًا ل FlowDirection من الأصول الخاصة بهم، و لكن النص الموجود داخل كل عنصر Span يتدفق طبقًا ل FlowDirectionالخاصة به. يمكن تطبيق هذا للاتينية و العربية – أو أي لغة أخرى.

إضافة xml:lang

يُظهر الرسم التالى مثال آخر يستخدم أرقام و تعبيرات حسابية مثل "200.0+21.4=221.4". لاحظ أن FlowDirection فقط قد تم تعيينه.

الرسم الذي يعرض الأرقام فقط باستخدام FlowDirection

الأرقام المتدفقة من اليمين إلى اليسار

مستخدمون هذا التطبيق سيشعرون بالاحباط من المخرجات، بالرغم من صحة FlowDirection لا يتم تشكيل الأرقام كما يجب أن يكون شكل الأرقام العربية.

يمكن أن تتضمن عناصر XAML XML سمات ( xml:lang) التي تعرف لغة كل عنصر. يدعم XAML أيضًا مبدأ لغة XML الذى فيه قيم xml:lang تطبق لعناصر الأصل في الشجرة مستخدمة من قبل عناصر تابعة. في المثال السابق، لأنه لم يتم تعريف لغة لـعنصر Run أو أي من عناصر المستوى الأعلى الخاص به ، تم استخدام xml:lang الافتراضي وهو en-US الخاص بXAML. خوارزمية تشكيل الرقم الداخلي منWindows Presentation Foundation (WPF) تحدد أالرقام في اللغة المقابلة – في هذه الحالة الإنكليزية. لتقديم الأرقام العربية بشكل صحيح نحتاج تعيين xml:lang .

يوضح الرسم التالي المثال مع إضافةxml:lang .

الرسم الذى يشرح استخدام سمة xml:lang

الأرقام العربية المتدفقة من اليمين إلى اليسار

يضيف المثال التالي xml:lang للتطبيق.

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    FlowDirection="RightToLeft">
      <FlowDocument>
         <Paragraph>
            <Span FlowDirection="RightToLeft" Language="ar-SA">
              العملية الحسابية: "200.0+21.4=221.4"
            </Span>
         </Paragraph>
      </FlowDocument>
</Page>

يجب أن تدرك أن أن العديد من اللغات مختلفة لديها قيمxml:langمختلفة استناداً إلى المنطقة المستهدفة، على سبيل المثال،"ar-SA" و"ar-EG" تمثل تباينين اثنين من العربية. توضح الأمثلة السابقة أنك تحتاج لتعريف قيم كلا من xml:lang و FlowDirection.

FlowDirection مع العناصر الغير نصية

يعرّفFlowDirection ليس فقط كيفية انسياب النص في عنصر نصي ولكن أيضاً اتجاه تدفق كل عنصرواجهة المستخدم آخر تقريباً . يوضح الرسم التالي ToolBar الذي يستخدم LinearGradientBrush أفقي لرسم الخلفية الخاصة به.

الرسومات التي تظهر ToolBar مع تدرج من اليسار إلى اليمين

لقطة شاشة لتدرج

بعد تعيين FlowDirection إلى RightToLeft ، لا يتم فقط ToolBar الأزرار مرتبة من صواب إلى اليسار ولكن حتى LinearGradientBrush realigns به الإزاحات بالتدفق من صواب إلى اليسار.

يُظهر الرسم التالى اعادة تنظيم LinearGradientBrush.

الرسومات التي تظهر ToolBar مع تدرج من اليمين إلى اليسار

تدرج متدفق من اليمين إلى اليسار

يرسم المثال التالي RightToLeft ToolBar. (لرسمها من اليسار الى اليمين ، قم بإزالة سمة FlowDirection على ToolBar.

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">

  <ToolBar FlowDirection="RightToLeft" Height="50" DockPanel.Dock="Top">
    <ToolBar.Background>
      <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,1">
        <LinearGradientBrush.GradientStops>
          <GradientStop Color="DarkRed" Offset="0" />
          <GradientStop Color="DarkBlue" Offset="0.3" />
          <GradientStop Color="LightBlue" Offset="0.6" />
          <GradientStop Color="White" Offset="1" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </ToolBar.Background>

    <Button FontSize="12" Foreground="White">Button1</Button>
    <Rectangle Width="20"/>
    <Button FontSize="12" Foreground="White">Button2</Button>
    <Rectangle Width="20"/>
    <Button FontSize="12" Foreground="White">Button3</Button>
    <Rectangle Width="20"/>
    <Button FontSize="12" Foreground="White">Button4</Button>
    <Rectangle Width="20"/>
  </ToolBar>
</Page>

استثناءات FlowDirection

هناك بعض الحالات حيث لا يتصرف FlowDirection كما هو متوقع. يغطي هذا المقطع اثنين من هذه الاستثناءات.

الصورة

Image يمثل عنصر تحكم يعرض الصور. في XAML يمكن استخدامها مع خاصية Source التي تعرّف معرف موارد منتظم (URI) الخاص ب Image للعرض.

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

يُظهر الرسم التالى Image معكوسة .

رسم يوضح الصورة المعكوسة

لقطة شاشة لـ XamlPad

يوضح المثال التالي أن Image يفشل فى ورث FlowDirection من StackPanel التي تحتوي عليه. ملاحظة   يجب أن يكون لديك ملف باسم ms_logo.jpg على محرك الأقراص C:\ لتشغيل هذا المثال.

<StackPanel 
  xmlns='https://schemas.microsoft.com/winfx/2006/xaml/presentation' 
  FlowDirection="RightToLeft">

  <Image Source="file://c:/ms_logo.jpg" 
         Width="147" Height="50"/>
  <Separator Height="10"/>
  <Image Source="file://c:/ms_logo.jpg" 
         Width="147" Height="50" FlowDirection="LeftToRight" />
  <Separator Height="10"/>
  <Image Source="file://c:/ms_logo.jpg" 
         Width="147" Height="50" FlowDirection="RightToLeft"/>
</StackPanel>

ملاحظة  المضمنة في ملفات التحميل فى ملف ms_logo.jpg. تفترض التعليمات البرمجية أن الملف .jpg ليس بداخل المشروع ولكن فى مكان ما فى محرك الأقراص C:\. يجب نسخ الملفات من نوع (.jpg) من ملفات المشروع فى محرك الأقراص C:\ أو تغيير التعليمات البرمجية للبحث عن الملف داخل المشروع. للقيام بذلك، غير Source="file://c:/ms_logo.jpg" إلى Source="ms_logo.jpg".

مسارات

بالإضافة إلى Image، عنصر آخر مثير للاهتمام Path. المسار هو عبارة عن كائن يمكنه رسم سلسلة من الخطوط المتصلة والمنحنيات. يتصرف بطريقة تشبه Image فيما يتعلق ب FlowDirection;على سبيل المثال RightToLeft FlowDirection الخاصة به عبارة عن متطابقة أفقية من LeftToRight ‎الخاصة به . ومع ذلك، بخلاف Image ، Pathالذى يرث FlowDirection الخاص به من الحاوية، و لا تحتاج لتحديده بشكل صريح.

يرسم المثال التالي سهم بسيط باستخدام 3 خطوط . يرث السهم الأول اتجاه تدفقRightToLeft من StackPanel بحيث يتم قياس نقاط البداية والنهاية الخاصة به من جذر على الجانب الأيمن. السهم الثاني الذي يحتوي علىRightToLeft FlowDirectionصريحة تبدأ التشغيل أيضاً على الجانب الأيمن. ومع ذلك، البداية الجذرية للسهم الثالث على الجانب الأيسر. للحصول على المزيد من المعلومات عن أدوات الرسم ، راجع LineGeometryو GeometryGroup.

<StackPanel 
  xmlns='https://schemas.microsoft.com/winfx/2006/xaml/presentation' 
  FlowDirection="RightToLeft">

  <Path Stroke="Blue" StrokeThickness="4">
    <Path.Data>
      <GeometryGroup >
        <LineGeometry StartPoint="300,10" EndPoint="350,30" />
        <LineGeometry StartPoint="10,30" EndPoint="352,30" />
        <LineGeometry StartPoint="300,50" EndPoint="350,30" />
      </GeometryGroup>
    </Path.Data>
  </Path>

  <Path Stroke="Red" StrokeThickness="4" FlowDirection="RightToLeft">
    <Path.Data>
      <GeometryGroup >
        <LineGeometry StartPoint="300,10" EndPoint="350,30" />
        <LineGeometry StartPoint="10,30" EndPoint="352,30" />
        <LineGeometry StartPoint="300,50" EndPoint="350,30" />
      </GeometryGroup>
    </Path.Data>
  </Path>

  <Path Stroke="Green" StrokeThickness="4" FlowDirection="LeftToRight">
    <Path.Data>
      <GeometryGroup >
        <LineGeometry StartPoint="300,10" EndPoint="350,30" />
        <LineGeometry StartPoint="10,30" EndPoint="352,30" />
        <LineGeometry StartPoint="300,50" EndPoint="350,30" />
      </GeometryGroup>
    </Path.Data>
  </Path>
</StackPanel>

يظهر الرسم التالى إخراج المثال السابق.

الرسم الذى يقوم بتوضيح الأسهم المرسمومة باستخدام مسار العنصر

مسارات

Image و Path مثالين لكيفية استخدام Windows Presentation Foundation (WPF)ل FlowDirection. بجانب تخطيط عناصر واجهة المستخدم في اتجاه معين داخل حاوية ما ، FlowDirection يمكن استخدامها مع عناصر مثل InkPresenter التي تعرض الحبر على السطح LinearGradientBrush ، RadialGradientBrush. عندما تحتاج سلوك من اليمين الى اليسار للمحتوى الذي يحاكي سلوك من يسار الى اليمين أو والعكس بالعكس Windows Presentation Foundation (WPF) يوفر هذه الإمكانية.

استبدال الأرقام

من وجهة تاريخية، Windows يحتوي على اعتماد استبدال الأرقام بالسماح مثيل أشكال الثقافية مختلفة على نفس الأرقام أثناء الاحتفاظ مخزن داخلي هذه الأرقام الموحدة بين لغات مختلفة على سبيل المثال الأرقام المخزنة في الخاصة بها معروفة للقيم الست عشرية، 0x40 ، 0x41 ، ولكن عرض وفقاً المحدد صواب.

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

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

الخاصية الأساسية المتحكمة فى كيفية عمل استبدال الأرقام في Windows Presentation Foundation (WPF) هو خاصية Substitution التبعية . تعيّن فئة NumberSubstitution كيف ستظهرالأرقام في النص . يحتوي على ثلاثة خصائص عامة و التي تعرّف سلوكه. التالي ملخص عن كل من الخصائص.

CultureSource:

هذه الخاصية تحديد كيف يتم تحديد البيانات الموروثة للأرقام. يأخذ واحدة من ثلاثة قيم ل
قائمة التعداد NumberCultureSource.

CultureOverride:

تستخدم خاصية CultureOverride فقط إذا كانت خاصية CultureSource معينة إلى Override ويتم تجاهلها فى الحالات الأخرى. وهي تحدد ثقافة العدد . قيمة من null ، القيمة الافتراضية ، يتم تفسيرها على أنها en-US.

الاستبدال:

تحدد هذه الخاصية نوع استبدال الرقم لينفذ. يأخذ أحد الإجراءات قيم التعداد NumberSubstitutionMethod التالية .

  • AsCulture: يتم تحديد أسلوب الاستبدال استناداً الى خاصية ىثقافة الرقمNumberFormatInfo.DigitSubstitution . هذا هو الإعداد الافتراضي.

  • Context: إذا كانت ثقافة الرقم العربية أو الفارسية، وهي تحدد أن الأرقام تعتمد على السياق.

  • European: يتم عرض الأرقام دوماً كـأرقام الأوروبية.

  • NativeNational: يتم تقديم الأرقام بالأرقام الدولية لثقافة الرقم ، كما هو محدد بواسطة NumberFormat للثقافة.

  • Traditional: تُستعرض الأرقام باستخدام الأرقام التقليدية إلى ثقافة الأرقام . لمعظم الثقافات هذا هو نفس NativeNational. ومع ذلك، NativeNational ينتج أرقام باللاتينية للحصول على بعض الثقافات العربية بينما ينتج الأرقام بالعربية لكل الثقافات العربية.

ماذا تعني هذه القيم لـ مطور محتوى ثنائي الاتجاه في معظم الحالات، المطور قد يحتاج المطور فقط لتعريف FlowDirection و اللغة لكل عنصر واجهة المستخدم نصي على سبيل المثال Language="ar-SA" و منطق NumberSubstitution تتولى عملية عرض الأرقام طبقًا ل واجهة المستخدم الصحيح . يوضح المثال التالي استخدام الأرقام العربية و الانجليزية في تطبيق Windows Presentation Foundation (WPF) قيد التشغيل في إصدار عربي من Windows.

<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" >
  <StackPanel>
   <TextBlock Background="LightGreen" FontSize="32" 
      Language="ar-SA" FlowDirection="RightToLeft">1+2=3</TextBlock>
   <TextBox Background="LightGreen" FontSize="32" 
      Language="ar-SA" FlowDirection="RightToLeft">1+2=3</TextBox>
   <TextBlock Background="LightBlue" FontSize="32">1+2=3</TextBlock>
   <TextBox Background="LightBlue" FontSize="32">1+2=3</TextBox>
 </StackPanel>
</Page>

يظهر الرسم التالى مخرجات النموذج السابق إذا كنت تستخدم الإصدار عربي من Windows.

رسم يعرض الأرقام العربية و الإنكليزية المعروضة

لقطة الشاشة XamlPad بالأرقام

FlowDirectionكان هاماً في هذه الحالة بسبب تعيين FlowDirectionالى LeftToRight بدلاً من ذلك قد يسفر عن الأرقام الأوروبية. تناقش المقاطع التالية كيفية الحصول عروض موحدة للأرقام خلال المستند. إذا لم يتم تشغيل هذا المثال على Windows بالعربية تعرض الأرقام كأرقام أوروبية .

تعريف قواعد الاستبدال

قد تحتاج في التطبيق الحقيقي لتعيين اللغة برمجياً. على سبيل المثال، تريد تعيين سمةxml:lang لتكون مثل المستخدمة من قبل واجهة المستخدمالخاص بالنظام ، أو قد تغير اللغة استناداً إلى حالة التطبيق .

إذا كنت تريد إجراء تغييرات استناداً إلى حالة التطبيق ، استخدام المميزات الأخرى المتوفرة من قبل Windows Presentation Foundation (WPF).

أولاً تعيين مكون التطبيق NumberSubstitution.CultureSource="Text". استخدام هذه الإعدادات تأكد من أن الإعدادات لا تأتي من واجهة المستخدم لـعناصر النص التي لها "المستخدم" افتراضياً، مثل TextBlock.

فعلى سبيل المثال:

<TextBlock

Name="text1" NumberSubstitution.CultureSource="Text">

1234+5679=6913

</TextBlock>

في التعليمات البرمجية #Cالمقابلة، قم بتعيين خاصية Language على سبيل المثال، إلى "ar-SA".

text1.Language =

System.Windows.Markup.XmlLanguage.GetLanguage("ar-SA");

إذا كنت في حاجة إلى تعيين خاصية Language الى لغة المستخدم الحالى واجهة المستخدم استخدام التعليمات البرمجية التالية.

text1.Language =

System.Windows.Markup.XmlLanguage.GetLanguage(

System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);

CurrentCulture يمثل البيانات الموروثة الحالية المستخدمة من قبل مؤشر الترابط الحالي في وقت التشغيل.

مثال XAMLالنهائي يجب أن يكون مشابهة للمثال التالي.

<Page x:Class="WindowsApplication.Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="Code Sample" Height="300" Width="300"
>
    <StackPanel>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft">عربى: 1+2=3
      </TextBlock>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft" 
         NumberSubstitution.Substitution="European">عربى: 1+2=3 
      </TextBlock>
    </StackPanel>
</Page>

مثال #Cالنهائي يجب أن يكون مشابهة للمثال التالي.

namespace BidiTest
{
    public partial class Window1 : Window
    {

        public Window1()
        {
            InitializeComponent();

            string currentLanguage = 
                System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag;

            text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(currentLanguage);

            if (currentLanguage.ToLower().StartsWith("ar"))
            {
                text1.FlowDirection = FlowDirection.RightToLeft;
            }
            else
            {
                text1.FlowDirection = FlowDirection.LeftToRight;
            }
        }
    }
}

يظهر الرسم التالى كيف يبدو الإطار لأى من لغات البرمجة.

الرسومات التي تعرض أرقام عربية

أرقام عربية

استخدام خاصية الاستبدال

طريقة عمل استبدال الرقم في Windows Presentation Foundation (WPF) تعتمد على كلامن لغة عنصر النص و FlowDirection الخاص به. إذا كان FlowDirectionمن اليسار الى اليمين، اذاً يتم تقديم الأرقام الأوروبية. ولكن إذا كان مسبوقاً بنص عربي أو يحتوي على اللغة معينة الى "ar" و FlowDirection يكون RightToLeft, يتم تقديم الأرقام العربية بدلاً من ذلك.

ومع ذلك، في بعض الحالات، قد تحتاج الى إنشاء أحد التطبيقات الموحدة، على سبيل المثال الأرقام الأوروبية لكافة المستخدمين. أو الأرقام العربية في خلايا Table بواسطة Styleمعين. طريقة سهلة لإجراء ذلك استخدام خاصيةSubstitution .

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

<Page x:Class="WindowsApplication.Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="Code Sample" Height="300" Width="300"
>
    <StackPanel>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft">عربى: 1+2=3
      </TextBlock>
      <TextBlock Language="ar-SA" 
         FlowDirection="RightToLeft" 
         NumberSubstitution.Substitution="European">عربى: 1+2=3 
      </TextBlock>
    </StackPanel>
</Page>