Bagikan melalui


Fitur Dua Arah dalam Gambaran Umum WPF

Tidak seperti platform pengembangan lainnya, WPF memiliki banyak fitur yang mendukung pengembangan cepat konten dua arah, misalnya, campuran data kiri ke kanan dan kanan ke kiri dalam dokumen yang sama. Pada saat yang sama, WPF menciptakan pengalaman yang sangat baik bagi pengguna yang memerlukan fitur dua arah seperti pengguna berbahasa Arab dan Ibrani.

Bagian berikut menjelaskan banyak fitur dua arah bersama dengan contoh yang menggambarkan cara mencapai tampilan konten dua arah terbaik. Sebagian besar sampel menggunakan XAML, meskipun Anda dapat dengan mudah menerapkan konsep ke kode C# atau Microsoft Visual Basic.

FlowDirection

Properti dasar yang menentukan arah aliran konten dalam aplikasi WPF adalah FlowDirection. Properti ini dapat diatur ke salah satu dari dua nilai enumerasi, LeftToRight atau RightToLeft. Properti tersedia untuk semua elemen WPF yang mewarisi dari FrameworkElement.

Contoh berikut mengatur arah TextBox alur elemen.

Arah alur kiri-ke-kanan

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

Arah aliran kanan-ke-kiri

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

Grafik berikut menunjukkan bagaimana kode sebelumnya dirender.

Graphic that illustrates the different flow directions.

Elemen dalam pohon antarmuka pengguna (UI) akan mewarisi FlowDirection dari kontainernya. Dalam contoh berikut, ada di TextBlock dalam Grid, yang berada di dalam Window. FlowDirection Mengatur untuk Window pengaturan tersirat untuk Grid dan TextBlock juga.

Contoh berikut menunjukkan pengaturan FlowDirection.

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

Tingkat Window atas memiliki RightToLeftFlowDirection, sehingga semua elemen yang terkandung di dalamnya juga mewarisi yang sama FlowDirection. Agar elemen mengambil alih yang ditentukan FlowDirection , elemen harus menambahkan perubahan arah eksplisit seperti yang kedua TextBlock dalam contoh sebelumnya yang berubah menjadi LeftToRight. Ketika tidak ada FlowDirection yang didefinisikan, default LeftToRight berlaku.

Grafik berikut menunjukkan output dari contoh sebelumnya:

Graphic that illustrates the explicit flow direction change.

FlowDocument

Banyak platform pengembangan seperti HTML, Win32, dan Java memberikan dukungan khusus untuk pengembangan konten dua arah. Bahasa markup seperti HTML memberi penulis konten markup yang diperlukan untuk menampilkan teks ke arah yang diperlukan, misalnya tag HTML 4.0, "dir" yang mengambil "rtl" atau "ltr" sebagai nilai. Tag ini mirip FlowDirection dengan properti , tetapi FlowDirection properti berfungsi dengan cara yang lebih canggih untuk tata letak konten tekstual dan dapat digunakan untuk konten selain teks.

Dalam elemen UI yang dapat menghosting kombinasi teks, tabel, gambar, dan elemen lainnya. Sampel di bagian berikut menggunakan elemen ini.

Menambahkan teks ke FlowDocument dapat dilakukan dengan lebih dari satu cara. Cara sederhana untuk melakukannya adalah melalui Paragraph yang merupakan elemen tingkat blok yang digunakan untuk mengelompokkan konten seperti teks. Untuk menambahkan teks ke elemen tingkat sebaris yang digunakan Span sampel dan Run. Span adalah elemen konten alur tingkat sebaris yang digunakan untuk mengelompokkan elemen sebaris lainnya, sementara adalah Run elemen konten alur tingkat sebaris yang dimaksudkan untuk berisi eksekusi teks yang tidak diformat. Span Dapat berisi beberapa Run elemen.

Contoh dokumen pertama berisi dokumen yang memiliki sejumlah nama berbagi jaringan; misalnya \\server1\folder\file.ext. Apakah Anda memiliki tautan jaringan ini dalam dokumen Arab atau Inggris, Anda selalu ingin tautan tersebut muncul dengan cara yang sama. Grafik berikut mengilustrasikan menggunakan elemen Rentang dan memperlihatkan tautan dalam dokumen Arab RightToLeft :

Graphic that illustrates using the Span element.

Karena teks adalah RightToLeft, semua karakter khusus, seperti "\", pisahkan teks dalam urutan kanan ke kiri. Itu mengakibatkan tautan tidak ditampilkan dalam urutan yang benar, oleh karena itu untuk menyelesaikan masalah, teks harus disematkan untuk mempertahankan alur LeftToRightterpisah Run . Alih-alih memiliki terpisah Run untuk setiap bahasa, cara yang lebih baik untuk menyelesaikan masalah adalah dengan menyematkan teks bahasa Inggris yang lebih jarang digunakan ke dalam bahasa Arab Spanyang lebih besar.

Grafik berikut mengilustrasikan ini dengan menggunakan elemen Jalankan yang disematkan dalam elemen Rentang:

Graphic that illustrates the Run element embedded in a Span element.

Contoh berikut menunjukkan penggunaan Run dan Span elemen dalam dokumen.

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

Elemen Rentang

Elemen Span ini berfungsi sebagai pemisah batas antara teks dengan arah alur yang berbeda. Bahkan Span elemen dengan arah alur yang sama dianggap memiliki cakupan dua arah yang berbeda yang berarti bahwa Span elemen diurutkan dalam kontainer FlowDirection, hanya konten dalam Span elemen yang mengikuti FlowDirection dari Span.

Grafik berikut menunjukkan arah alur beberapa TextBlock elemen.

Graphic that illustrates text blocks with different flow directions.

Contoh berikut menunjukkan cara menggunakan Span elemen dan Run untuk menghasilkan hasil yang ditunjukkan pada grafik sebelumnya.

<Page xmlns="http://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 Dalam elemen dalam sampel, elemen diletakkan Span sesuai dengan FlowDirection induknya, tetapi teks dalam setiap Span elemen mengalir sesuai dengan elemennya sendiriFlowDirection. Ini berlaku untuk bahasa Latin dan Arab – atau bahasa lain.

Menambahkan xml:lang

Grafik berikut menunjukkan contoh lain yang menggunakan angka dan ekspresi aritmatika, seperti "200.0+21.4=221.4". Perhatikan bahwa hanya yang FlowDirection ditetapkan.

Graphic that displays numbers using only FlowDirection.

Pengguna aplikasi ini akan kecewa dengan output, meskipun FlowDirection benar angka tidak dibentuk sebagai angka Arab harus dibentuk.

Elemen XAML dapat menyertakan atribut XML (xml:lang) yang menentukan bahasa setiap elemen. XAML juga mendukung prinsip bahasa XML di mana xml:lang nilai yang diterapkan ke elemen induk di pohon digunakan oleh elemen turunan. Dalam contoh sebelumnya, karena bahasa tidak didefinisikan untuk Run elemen atau elemen tingkat atasnya, default xml:lang digunakan, yaitu en-US untuk XAML. Algoritma pembentukan nomor internal Windows Presentation Foundation (WPF) memilih angka dalam bahasa yang sesuai - dalam hal ini bahasa Inggris. Untuk membuat render angka Arab harus diatur dengan benar xml:lang .

Grafik berikut menunjukkan contoh dengan xml:lang ditambahkan.

Graphic that illustrates Arabic numbers that flow from right to left.

Contoh berikut menambahkan xml:lang ke aplikasi.

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

Ketahuilah bahwa banyak bahasa memiliki nilai yang berbeda xml:lang tergantung pada wilayah yang ditargetkan, misalnya, "ar-SA" dan "ar-EG" mewakili dua variasi bahasa Arab. Contoh sebelumnya menggambarkan bahwa Anda perlu menentukan nilai xml:lang dan FlowDirection .

FlowDirection dengan Elemen Non-teks

FlowDirection mendefinisikan tidak hanya bagaimana teks mengalir dalam elemen tekstual tetapi juga arah alur hampir setiap elemen UI lainnya. Grafik berikut menunjukkan ToolBar yang menggunakan horizontal LinearGradientBrush untuk menggambar latar belakangnya dengan gradien kiri ke kanan.

Graphic that shows a toolbar with a left to right gradient.

Setelah mengatur FlowDirection ke RightToLeft, tidak hanya ToolBar tombol yang diatur dari kanan ke kiri, tetapi bahkan LinearGradientBrush realigns offset-nya untuk mengalir dari kanan ke kiri.

Grafik berikut menunjukkan realignment dari LinearGradientBrush.

Graphic that shows a toolbar with a right to left gradient.

Contoh berikut menggambar RightToLeftToolBar. (Untuk menggambarnya dari kiri ke kanan, hapus FlowDirection atribut pada ToolBar.

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

Pengecualian FlowDirection

Ada beberapa kasus di mana FlowDirection tidak berperilaku seperti yang diharapkan. Bagian ini mencakup dua pengecualian ini.

Gambar

Mewakili Image kontrol yang menampilkan gambar. Di XAML dapat digunakan dengan Source properti yang menentukan pengidentifikasi sumber daya seragam (URI) dari yang Image akan ditampilkan.

Tidak seperti elemen UI lainnya, tidak Image mewarisi FlowDirection dari kontainer. Namun, jika FlowDirection diatur secara eksplisit ke RightToLeft, ditampilkan Image dibalik secara horizontal. Ini diimplementasikan sebagai fitur yang nyaman untuk pengembang konten dua arah; karena dalam beberapa kasus, membalik gambar secara horizontal menghasilkan efek yang diinginkan.

Grafik berikut menunjukkan flip Image.

Graphic that illustrates a flipped image.

Contoh berikut menunjukkan bahwa Image gagal mewarisi FlowDirection dari StackPanel yang berisinya.

Catatan

Anda harus memiliki file bernama ms_logo.jpg di drive C:\ Anda untuk menjalankan contoh ini.

<StackPanel 
  xmlns='http://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>

Catatan

Disertakan dalam file unduhan adalah file ms_logo.jpg . Kode mengasumsikan bahwa file .jpg tidak berada di dalam proyek Anda tetapi di suatu tempat di drive C:\. Anda harus menyalin .jpg dari file proyek ke drive C:\ Anda atau mengubah kode untuk mencari file di dalam proyek. Untuk melakukan perubahan Source="file://c:/ms_logo.jpg" ini ke Source="ms_logo.jpg".

Jalur

Selain Image, elemen menarik lainnya adalah Path. Jalur adalah objek yang dapat menggambar serangkaian garis dan kurva yang terhubung. Ini berulah dengan cara yang Image mirip dengan mengenai FlowDirection; misalnya itu RightToLeftFlowDirection adalah cermin horizontal dari cerminnya LeftToRight . Namun, tidak seperti Image, Path mewarisinya FlowDirection dari kontainer dan seseorang tidak perlu menentukannya secara eksplisit.

Contoh berikut menggambar panah sederhana menggunakan 3 baris. Panah pertama mewarisi RightToLeft arah alur dari StackPanel sehingga titik awal dan akhirnya diukur dari akar di sisi kanan. Panah kedua yang memiliki eksplisit RightToLeftFlowDirection juga dimulai di sisi kanan. Namun, panah ketiga memiliki akar awal di sisi kiri. Untuk informasi selengkapnya tentang menggambar lihat LineGeometry dan GeometryGroup.

<StackPanel 
  xmlns='http://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>

Grafik berikut menunjukkan output contoh sebelumnya dengan panah yang digambar Path menggunakan elemen :

Graphic that illustrates arrows drawn using the Path element.

Image dan Path adalah dua contoh bagaimana WPF menggunakan FlowDirection. Selain meletakkan elemen UI ke arah tertentu dalam kontainer, FlowDirection dapat digunakan dengan elemen seperti InkPresenter yang merender tinta pada permukaan, LinearGradientBrush, RadialGradientBrush. Setiap kali Anda memerlukan perilaku kanan ke kiri untuk konten Anda yang meniru perilaku kiri ke kanan, atau sebaliknya, Windows Presentation Foundation (WPF) menyediakan kemampuan tersebut.

Penggantian Angka

Secara historis, Windows telah mendukung penggantian angka dengan memungkinkan representasi bentuk budaya yang berbeda untuk digit yang sama sambil menjaga penyimpanan internal digit ini terpadu di antara lokal yang berbeda, misalnya angka disimpan dalam nilai heksadesimal yang terkenal, 0x40, 0x41, tetapi ditampilkan sesuai dengan bahasa yang dipilih.

Ini telah memungkinkan aplikasi untuk memproses nilai numerik tanpa perlu mengonversinya dari satu bahasa ke bahasa lain, misalnya pengguna dapat membuka lembar bentang Microsoft Excel di Windows Arab yang dilokalkan dan melihat angka yang dibentuk dalam bahasa Arab, tetapi membukanya di versi Windows Eropa dan melihat representasi Eropa dari angka yang sama. Ini juga diperlukan untuk simbol lain seperti pemisah koma dan simbol persentase karena biasanya menyertai angka dalam dokumen yang sama.

Windows Presentation Foundation (WPF) melanjutkan tradisi yang sama, dan menambahkan dukungan lebih lanjut untuk fitur ini yang memungkinkan lebih banyak kontrol pengguna atas kapan dan bagaimana penggantian digunakan. Meskipun fitur ini dirancang untuk bahasa apa pun, fitur ini sangat berguna dalam konten dua arah di mana membentuk digit untuk bahasa tertentu biasanya merupakan tantangan bagi pengembang aplikasi karena berbagai budaya yang mungkin dijalankan aplikasi.

Properti inti yang mengontrol cara kerja substitusi angka di Windows Presentation Foundation (WPF) adalah Substitution properti dependensi. Kelas NumberSubstitution menentukan bagaimana angka dalam teks akan ditampilkan. Ini memiliki tiga properti publik yang menentukan perilakunya. Berikut ini adalah ringkasan dari setiap properti:

CultureSource:

Properti ini menentukan bagaimana budaya untuk angka ditentukan. Dibutuhkan salah satu dari tiga NumberCultureSource nilai enumerasi.

CultureOverride:

Properti CultureOverride hanya digunakan jika CultureSource properti diatur ke Override dan diabaikan sebaliknya. Ini menentukan budaya angka. Nilai null, nilai default, ditafsirkan sebagai en-US.

Pergantian:

Properti ini menentukan jenis substitusi angka yang akan dilakukan. Dibutuhkan salah satu nilai enumerasi berikut NumberSubstitutionMethod :

  • AsCulture: Metode substitusi ditentukan berdasarkan properti kultur NumberFormatInfo.DigitSubstitution angka. Ini adalah default.

  • Context: Jika budaya angka adalah budaya Arab atau Persia, itu menentukan bahwa digit tergantung pada konteksnya.

  • European: Angka selalu dirender sebagai digit Eropa.

  • NativeNational: Angka dirender menggunakan digit nasional untuk budaya angka, seperti yang ditentukan oleh budaya NumberFormat.

  • Traditional: Angka dirender menggunakan digit tradisional untuk budaya angka. Untuk sebagian besar budaya, ini sama dengan NativeNational. Namun, NativeNational menghasilkan digit Latin untuk beberapa budaya Arab, sedangkan nilai ini menghasilkan digit Arab untuk semua budaya Arab.

Apa arti nilai-nilai tersebut untuk pengembang konten dua arah? Dalam kebanyakan kasus, pengembang mungkin hanya perlu menentukan FlowDirection dan bahasa setiap elemen UI tekstual, misalnya Language="ar-SA" dan NumberSubstitution logika mengurus menampilkan angka sesuai dengan UI yang benar. Contoh berikut menunjukkan penggunaan angka Arab dan Inggris dalam aplikasi Windows Presentation Foundation (WPF) yang berjalan dalam versi Arab Windows.

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

Grafik berikut menunjukkan output sampel sebelumnya jika Anda menjalankan dalam versi Arab Windows dengan nomor Bahasa Arab dan Inggris ditampilkan:

Graphic that shows Arabic and English numbers.

Itu FlowDirection penting dalam hal ini karena mengatur ke FlowDirectionLeftToRight sebagai gantinya akan menghasilkan digit Eropa. Bagian berikut membahas cara memiliki tampilan digit terpadu di seluruh dokumen Anda. Jika contoh ini tidak berjalan di Windows Arab, semua digit ditampilkan sebagai digit Eropa.

Menentukan Aturan Substitusi

Dalam aplikasi nyata, Anda mungkin perlu mengatur Bahasa secara terprogram. Misalnya, Anda ingin mengatur xml:lang atribut agar sama dengan yang digunakan oleh UI sistem, atau mungkin mengubah bahasa tergantung pada status aplikasi.

Jika Anda ingin membuat perubahan berdasarkan status aplikasi, gunakan fitur lain yang disediakan oleh Windows Presentation Foundation (WPF).

Pertama, atur komponen NumberSubstitution.CultureSource="Text"aplikasi . Menggunakan pengaturan ini memastikan bahwa pengaturan tidak berasal dari UI untuk elemen teks yang memiliki "Pengguna" sebagai default, seperti TextBlock.

Contohnya:

<TextBlock
   Name="text1" NumberSubstitution.CultureSource="Text">
   1234+5679=6913
</TextBlock>

Dalam kode C# yang sesuai, atur Language properti, misalnya, ke "ar-SA".

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

Jika Anda perlu mengatur properti ke Language bahasa UI pengguna saat ini, gunakan kode berikut.

text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);

CultureInfo.CurrentCulture mewakili budaya saat ini yang digunakan oleh utas saat ini pada waktu proses.

Contoh XAML akhir Anda harus mirip dengan contoh berikut.

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

Contoh C# akhir Anda harus mirip dengan yang berikut ini.

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

Grafik berikut menunjukkan seperti apa jendela untuk salah satu bahasa pemrograman, menampilkan angka Arab:

Graphic that displays Arabic numbers.

Menggunakan Properti Substitusi

Cara kerja substitusi angka di Windows Presentation Foundation (WPF) tergantung pada Bahasa elemen teks dan FlowDirection. Jika dibiarkan FlowDirection ke kanan, digit Eropa akan dirender. Namun jika didahului oleh teks Arab, atau memiliki bahasa yang diatur ke "ar" dan FlowDirection adalah RightToLeft, digit Arab dirender sebagai gantinya.

Namun, dalam beberapa kasus, Anda mungkin ingin membuat aplikasi terpadu, misalnya digit Eropa untuk semua pengguna. Atau digit Arab dalam Table sel dengan .Style Salah satu cara mudah untuk melakukannya adalah menggunakan Substitution properti .

Dalam contoh berikut, yang pertama TextBlock tidak memiliki Substitution kumpulan properti, sehingga algoritma menampilkan digit Arab seperti yang diharapkan. Namun di yang kedua TextBlock, substitusi diatur ke Eropa yang mengambil alih penggantian default untuk angka Arab, dan digit Eropa ditampilkan.

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