共用方式為


WPF 中的雙向功能概觀

更新:2007 年 11 月

和其他開發平台不同,WPF 具有許多功能可支援快速開發雙向 (Bidirectional) 內容,例如,在同一份文件中混合由左至右和由右至左的資料。同時,WPF 能替需要雙向功能的使用者 (如說阿拉伯文和希伯來文的使用者),創造絕佳的經驗。

下列各節說明雙向功能,並提供用以說明如何達到雙向內容最佳顯示的範例。大部分範例使用 XAML,不過您可以輕易地將概念運用到 C# 或 Microsoft Visual Basic 程式碼。

這個主題包含下列章節。

  • FlowDirection
  • FlowDocument
  • Span 項目
  • 非文字項目的 FlowDirection
  • 數字替換

FlowDirection

在 WPF 應用程式中定義內容流向的基本屬性為 FlowDirection。這個屬性可用於設定下列其中一個列舉值:LeftToRightRightToLeft。此屬性可用於所有繼承自 FrameworkElement 的 WPF 項目。

注意事項:

本主題中的所有圖形會顯示程式碼以及如何呈現於 XAMLPad 工具中。而且在大部分情況下,都會提供您可以下載的範例。

下列範例會設定 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>

如需完整的範例,請參閱 LeftToRight 和 RightToLeft 範例

下圖顯示先前程式碼的呈現方式。

說明 FlowDirection 的圖形

TextBlock 對齊

使用者介面 (UI) 樹狀結構中的項目會從其容器 (Container) 繼承 FlowDirection。在下列範列中,TextBlockGrid 之內,而 Grid 位於 Window 中。設定 WindowFlowDirection 意味同時針對 GridTextBlock 進行設定。

下列範例會示範如何設定 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 具有 RightToLeftFlowDirection,所以其內含的所有項目也會繼承相同的 FlowDirection。至於要覆寫指定之 FlowDirection 的項目,則必須加入明確的方向變更,例如前一個範例中的第二個 TextBlock 會變更為 LeftToRight。未定義 FlowDirection 的情況下,則會套用預設 LeftToRight

如需完整的範例,請參閱 FlowDirection 範例

下圖顯示前一個範例的輸出。

說明明確指定之 FlowDirection 的圖形

文字顯示方向圖例

FlowDocument

許多開發平台 (例如,HTML、Win32 和 Java™) 都提供雙向內容開發的特殊支援。如 HTML 之類的標記語言會將所需的標記提供給內容寫入器,以便以任何所需的方向顯示文字,以 HTML 4.0 標記為例,"dir" 會採用 "rtl" 或 "ltr" 值。這個標記類似於 FlowDirection 屬性,但 FlowDirection 屬性會以更進階個方式來配置文字內容,而且可用於文字以外的內容。

在 WPF 中,FlowDocument 為多用途的 UI 項目,可以裝載 (Host) 文字、表格、影像和其他項目的組合。下列各節中的範例會使用此項目。

有很多種方法可以將文字加入至 FlowDocument。其中一種簡單方法就是透過 Paragraph,這是用於群組文字之類內容的區塊層級項目。為了將文字加入至內嵌層級項目,範例會使用 SpanRunSpan 為內嵌層級非固定格式內容項目,適用於群組其他內嵌項目,而 Run 則為內嵌層級非固定格式內容項目,主要用於包含一連串未格式化的文字。Span 可以包含多個 Run 項目。

第一個文件範例所包含的文件具有許多網路共用名稱,例如 \\server1\folder\file.ext。不論是在阿拉伯文或英文文件中有此網路連結,您都會希望該連結以相同的方式顯示。下圖顯示在阿拉伯文 RightToLeft 文件中的這個連結。

說明如何使用 Span 項目的圖形

文字顯示方向為由左至右的文件

因為文字是 RightToLeft,所以 "\" 之類的所有特殊字元都會以由右至左的順序分隔文字。結果導致連結不是以正確的順序顯示,因此,若要解決此問題,就必須內嵌文字以保留個別的 Run 流動 LeftToRight。除了讓每種語言具有個別的 Run 以外,解決此問題的更好方法是將不常用的英文文字內嵌到較大的阿拉伯文 Span 中。

下圖將說明這點。

說明如何使用內嵌於 Span 項目中之 Run 項目的圖形

XamlPad 螢幕擷取畫面

下列範例會示範如何在文件中使用 RunSpan 項目。

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

如需完整的範例,請參閱 RunSpan 範例

Span 項目

Span 項目的作用為具有不同流向的文字之間的界限分隔符號。甚至具有相同流向的 Span 項目都會被視為有不同雙向範圍,這表示 Span 項目是以容器的 FlowDirection 排序,而只有 Span 項目內的內容會遵循 SpanFlowDirection

下圖顯示數個 TextBlock 項目的流向。

說明數個 TextBlock 項目中之 FlowDirection 的圖形

文字方向不同的文字區塊

下列範例顯示如何使用 SpanRun 項目,產生上圖所示的結果。

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

如需完整的程式碼範例,請參閱 Span 範例

在本範例的 TextBlock 項目中,Span 項目會根據其父代 (Parent) 的 FlowDirection 進行配置,但每個 Span 項目內的文字則是根據其擁有的 FlowDirection 而流動。這適用於拉丁文和阿拉伯文 – 或任何其他語言。

加入 xml:lang

下圖顯示另一個使用數字和算術運算式 (如 “200.0+21.4=221.4”) 的範例。請注意,只會設定 FlowDirection

僅使用 FlowDirection 顯示數字的圖形

方向由右至左的數字

即使 FlowDirection 正確無誤,此應用程式的使用者將會對輸出感到失望,因為數字的外形並非阿拉伯數字應有的外形。

XAML 項目會繼承名為 XAML 中的 xml:lang 處理 (其別名 Language) 的 XML 屬性,該屬性會定義每個項目的語言。在前一個範例中,因為未針對 Run 項目或任何其最上層項目定義語言,所以會使用預設語言 (即 en-US)。Windows Presentation Foundation (WPF) 的內部數字外形演算法會選取對應語言 (在此例中為英文) 中的數字。若要使阿拉伯數字得以正確呈現,則必須設定 XAML 中的 xml:lang 處理 (Language)。

下圖顯示已加入 Language 屬性的範例。

說明如何使用 xml:lang 屬性的圖形

方向由右至左的阿拉伯數字

下列範例會將 XAML 中的 xml:lang 處理 (Language) 加入至應用程式。

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

如需完整的範例,請參閱 LanguageAttribute 範例

請特別注意,許多語言會根據目標區域而定,而有不同的語言值,例如 "ar-SA" 和 "ar-EG" 代表阿拉伯文的兩種變化。先前範例說明您必須定義 Language (xml:lang) 和 FlowDirection 屬性。

非文字項目的 FlowDirection

FlowDirection 不僅會定義文字項目中的文字流動方式,也會定義幾乎其他每個 UI 項目的流動。下圖所顯示的 ToolBar 會使用水平 LinearGradientBrush 來繪製其背景。

顯示具有由左至右漸層之 ToolBar 的圖形

漸層螢幕擷取畫面

FlowDirection 設為 RightToLeft 之後,不僅 ToolBar 按鈕會由右至左排列,甚至 LinearGradientBrush 也會重新對齊其位移 (Offset),以便由右至左流動。

下圖顯示 LinearGradientBrush 的重新對齊方式。

顯示具有由右至左漸層之 ToolBar 的圖形

方向為由右至左的漸層

下列範例將繪製 RightToLeftToolBar。若要由左至右進行繪製,請移除 ToolBarFlowDirection 屬性。

<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 的行為不如預期。本節涵蓋其中兩種例外狀況 (Exception)。

影像

Image 表示會顯示影像的控制項。在 XAML 中,它可搭配 Source 屬性使用,該屬性會定義要顯示之 Image 的統一資源識別元 (URI)。

和 UI 項目不同,Image 不會從容器繼承 FlowDirection。但是,如果 FlowDirection 已明確設定為 RightToLeft,則 Image 會以水平翻轉方式顯示。雙向內容的開發人員會將此當做方便的功能實作,因為在某些情況下,水平翻轉影像可產生所要的效果。

下圖顯示已翻轉的 Image

說明已翻轉影像的圖形

XamlPad 螢幕擷取畫面

下列範例示範 Image 無法從包含它的 StackPanel 繼承 FlowDirection注意:您的 C:\ 磁碟機上必須要有名為 ms_logo.jpg 的檔案,才能執行此範例。

<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。Path 就是可以繪製一系列相連線條和曲線的物件。至於其 FlowDirection 的行為方式則類似於 Image,例如它的 RightToLeftFlowDirection 為其 LeftToRight 流向的水平左右反轉。但是,和 Image 不同,Path 會從容器繼承它的 FlowDirection,使用者不須進行明確指定。

下列範例會使用三條線來繪製簡單的箭號。第一個箭號會從 StackPanel 繼承 RightToLeft 流向,以便從右邊的根測量其開始和結束點。而具有明確 RightToLeftFlowDirection 的第二個箭號也是從右邊開始。但是,第三個箭號的起始根則在左邊。如需繪圖的詳細資訊,請參閱 LineGeometryGeometryGroup

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

如需完整的範例,請參閱路徑範例

下圖顯示前一個範例的輸出。

說明如何使用 Path 項目繪製箭號的圖形

路徑

ImagePath 為 Windows Presentation Foundation (WPF) 如何使用 FlowDirection 的兩個範例。除了在容器內以特定方向配置 UI 項目以外,FlowDirection 可以搭配 InkPresenter (該項目可在表面上呈現筆跡)、LinearGradientBrushRadialGradientBrush 之類的項目使用。每當模擬由左至右行為的內容需要由右至左行為時 (反之亦然),Windows Presentation Foundation (WPF) 都可提供該功能。

數字替換

Windows 過去支援數字替換功能,其做法為允許相同的數字有不同的文化表示形式,並且使這些數字的內部儲存在不同的地區設定 (Locale) 內保持統一。例如:數字會以其知名的十六進位值 0x40、0x41 儲存,但會根據選取的語言予以顯示。

如此一來,應用程式不須將數值從某種語言轉換成另一種語言,便可處理數值。例如,使用者可以在當地語系化的阿拉文 Windows 中開啟 Microsoft Excel 試算表,並且看見阿拉伯文形式的數字,但在歐語版的 Windows 中開啟試算表,卻會看見相同數字的歐語表示。其他符號 (如逗號分隔符號和百分比符號) 也需要這項功能,因為這些符號通常會在同份文件中伴隨數字出現。

Windows Presentation Foundation (WPF) 延續了相同的傳統,並加入這項功能的進一步支援,而讓使用者更能夠掌控使用替換功能的時機和方式。這項功能雖然是針對所有語言設計,但它卻特別適用於雙向內容。在雙向內容中,設計特定語言的數字外形通常是應用程式開發人員的一大挑戰,因為應用程式可能會在各種的文化特性 (Culture) 中執行。

控制如何在 Windows Presentation Foundation (WPF) 中運用數字替換的核心屬性就是 Substitution 相依性屬性。NumberSubstitution 類別會指定文字中數字的顯示方式。該類別有三個公用屬性可定義其行為。以下是每個屬性的摘要。

CultureSource:

這個屬性可指定如何決定數字的文化特性。它會採用三個 NumberCultureSource 列舉值的其中一個。

CultureOverride

CultureSource 屬性設為 Override 時,才會使用 CultureOverride 屬性,否則會予以忽略。該屬性可指定數字文化特性。值為 null (預設值) 會解譯為 en-US。

Substitution

這個屬性會指定要執行的數字替換類型。它會採用下列其中一個 NumberSubstitutionMethod 列舉值。

  • AsCulture:會根據數字文化特定的 NumberFormatInfo.DigitSubstitution 屬性來決定替換方式。此為預設值。

  • Context:如果數字文化特性為阿拉伯或波斯文化特性,則會指定數字需視內容而定。

  • European:數字一律呈現為歐語數字。

  • NativeNational:會使用國際數字的數字文化特性來呈現數字,如同文化特性的 NumberFormatInfo 屬性所指定。

  • Traditional:會使用傳統數字的數字文化特性來呈現數字。對大多數的文化特性來說,這與 NativeNational 相同。不過,NativeNational 會在某些阿拉伯文化特性中呈現拉丁數字,然而此值會在所有的阿拉伯文化特性中呈現阿拉伯數字。

這些值對雙向內容開發人員而言有何意義?在大部分情況下,開發人員可能只需要定義每個文字 UI 項目 FlowDirection 和語言,例如 Language=”ar-SA”,而 NumberSubstitution 邏輯會根據正確的 UI 負責顯示數字。下列範例會示範如何在執行於 Windows 阿拉伯文版的 Windows Presentation Foundation (WPF) 應用程式中使用阿拉伯和英文數字。

<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 阿拉伯文版上執行,則所有數字都會顯示為歐語數字。

定義替換規則

在真正的應用程式中,您可能需要以程式設計的方式設定語言。例如,您想要將 Language (xml:lang) 屬性設為與系統 UI 所用的屬性相同,或者也可以根據應用程式狀態變更 Language。

如果您想根據應用程式的狀態進行變更,請使用 Windows Presentation Foundation (WPF) 所提供的其他功能。

首先,設定應用程式元件的 NumberSubstitution.CultureSource=“Text”。使用此設定可確保設定並非來自以「使用者」做為預設值之文字項目 (如 TextBlock) 的 UI。

例如:

<TextBlock

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

1234+5679=6913

</TextBlock>

在對應的 C# 程式碼中,設定 Language 屬性 (例如設為 "ar-SA")。

text1.Language =

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

如果您需要將 Language 屬性設為目前使用者的 UI 語言,請使用下列程式碼。

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>

如需完整的範例,請參閱 Numbers2 範例

您最後的 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;
            }
        }
    }
}

如需完整範例,請參閱 NumbersCSharp 範例

下圖顯示各程式設計語言的視窗外觀。

顯示阿拉伯數字的圖形

阿拉伯數字

使用 Substitution 屬性

數字替換在 Windows Presentation Foundation (WPF) 中的運作方式,會取決於文字項目的語言與其 FlowDirection。如果 FlowDirection 為由左至右,則會呈現歐語數字。但是,如果數字前面接著阿拉伯文字,或語言設定為 "ar" 且 FlowDirectionRightToLeft,則會改為呈現阿拉伯數字。

然而,在某些情況下,您可能想建立統一的應用程式,例如:所有使用者都適用歐語數字。或者,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>

如需完整的範例,請參閱 Numbers3 範例