Sdílet prostřednictvím


Přehled obousměrných funkcí ve WPF

Na rozdíl od jakékoli jiné vývojové platformy má WPF mnoho funkcí, které podporují rychlý vývoj obousměrného obsahu, například smíšené data zleva doprava a zprava doleva ve stejném dokumentu. WpF současně vytváří vynikající prostředí pro uživatele, kteří vyžadují obousměrné funkce, jako jsou arabština a hebrejština hovořící uživatelé.

Následující části vysvětlují řadu obousměrných funkcí společně s příklady, které ilustrují, jak dosáhnout nejlepšího zobrazení obousměrného obsahu. Většina ukázek používá XAML, ale koncepty můžete snadno použít na kód jazyka C# nebo Microsoft Visual Basic.

FlowDirection

Základní vlastnost, která definuje směr toku obsahu v aplikaci WPF je FlowDirection. Tuto vlastnost lze nastavit na jednu ze dvou hodnot výčtu, LeftToRight nebo RightToLeft. Vlastnost je k dispozici pro všechny prvky WPF, které dědí z FrameworkElement.

Následující příklady nastavily směr toku elementu TextBox .

Směr toku zleva doprava

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

Směr toku zprava doleva

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

Následující obrázek ukazuje, jak se předchozí kód vykresluje.

Obrázek znázorňující různé směry toku

Prvek ve stromu uživatelského rozhraní (UI) zdědí FlowDirection z jeho kontejneru. V následujícím příkladu je TextBlock uvnitř Grid, který se nachází v Window. Nastavení FlowDirection pro Window znamená také nastavení pro Grid a TextBlock.

Následující příklad ukazuje nastavení 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>

Nejvyšší úroveň WindowRightToLeftFlowDirection, takže všechny prvky, které jsou v ní obsaženy, také dědí stejné FlowDirection. Aby prvek přepsl zadaný FlowDirection , musí přidat explicitní změnu směru, například druhý TextBlock v předchozím příkladu, který se změní na LeftToRight. Pokud není definováno, FlowDirection použije se výchozí hodnota LeftToRight .

Následující obrázek ukazuje výstup předchozího příkladu:

Obrázek znázorňující změnu explicitního směru toku

FlowDocument

Mnoho vývojových platforem, jako je HTML, Win32 a Java, poskytuje zvláštní podporu pro obousměrný vývoj obsahu. Jazyky značek, jako je HTML, poskytují autorům obsahu potřebné značky k zobrazení textu v libovolném požadovaném směru, například značky HTML 4.0, "dir", která jako hodnoty přebírá "rtl" nebo "ltr". Tato značka je podobná FlowDirection vlastnosti, ale FlowDirection tato vlastnost funguje pokročilejším způsobem rozložení textového obsahu a lze ji použít pro jiný obsah než text.

V prvku uživatelského rozhraní, který může hostovat kombinaci textu, tabulek, obrázků a dalších prvků. Ukázky v následujících částech používají tento prvek.

Přidání textu do FlowDocument lze provést více než jedním způsobem. Jednoduchým způsobem, jak to udělat, je prostřednictvím Paragraph elementu na úrovni bloku, který se používá k seskupení obsahu, jako je text. Chcete-li přidat text k vloženým prvkům, ukázky používají značky Span a Run. Span je vložený prvek prvků textového toku používaný pro seskupování dalších vložených prvků, zatímco Run je vložený prvek prvků textového toku určený pro nesformátovaný text. A Span může obsahovat více Run prvků.

První příklad dokumentu obsahuje dokument, který má řadu názvů sdílených síťových složek; například \\server1\folder\file.ext. Bez ohledu na to, jestli máte tento síťový odkaz v arabském nebo anglickém dokumentu, chcete, aby se vždy zobrazoval stejným způsobem. Následující obrázek znázorňuje použití elementu Span a ukazuje odkaz v arabském RightToLeft dokumentu:

Obrázek znázorňující použití elementu Span

Vzhledem k tomu, že text je RightToLeft, všechny speciální znaky, například "\", oddělují text zprava doleva. Výsledkem je, že se odkaz nezobrazuje ve správném pořadí, proto k vyřešení problému musí být text vložen, aby se zachoval samostatný Run tok LeftToRight. Místo samostatného Run pro každý jazyk je lepší způsob, jak tento problém vyřešit, vložit méně často používaný anglický text do většího arabského Span.

Následující obrázek znázorňuje použití elementu Run vloženého do elementu Span:

Obrázek znázorňující prvek Run vložený do elementu Span

Následující příklad ukazuje použití Run a Span prvky v dokumentech.

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

Span – elementy

Element Span funguje jako oddělovač hranic mezi texty s různými směry toku. Dokonce i Span prvky se stejným směrem toku se považují za různé obousměrné obory, což znamená, že Span prvky jsou seřazeny v kontejneru FlowDirection, pouze obsah v rámci Span prvku následuje FlowDirection .Span

Následující obrázek znázorňuje směr toku několika TextBlock prvků.

Obrázek znázorňující textové bloky s různými směry toku

Následující příklad ukazuje, jak použít Span a Run prvky k vytvoření výsledků zobrazených v předchozím obrázku.

<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 V prvcích v ukázce Span jsou prvky rozloženy podle FlowDirection jejich nadřazených prvků, ale text uvnitř každého Span prvku proudí podle svého vlastního FlowDirection. To platí pro latinku a arabštinu nebo jakýkoli jiný jazyk.

Přidání xml:lang

Následující obrázek ukazuje další příklad, který používá čísla a aritmetické výrazy, například "200.0+21.4=221.4". Všimněte si, že je nastaveno pouze FlowDirection.

Obrázek, který zobrazuje čísla pouze pomocí FlowDirection.

Uživatelé této aplikace budou výstupem zklamaní, protože i když FlowDirection je správná, čísla nejsou ve správném tvaru, jak by měla být arabská čísla.

Elementy XAML mohou obsahovat atribut XML (xml:lang), který definuje jazyk každého elementu. XAML také podporuje princip jazyka XML, kdy xml:lang hodnoty použité u nadřazených elementů ve stromu jsou používány podřízenými elementy. V předchozím příkladu, protože jazyk nebyl definován pro Run element nebo některý z jeho elementů nejvyšší úrovně, byl použit výchozí xml:lang , což je en-US pro XAML. Interní algoritmus tvarování čísel technologie Windows Presentation Foundation (WPF) vybere čísla v odpovídajícím jazyce – v tomto případě angličtina. Aby se arabská čísla vykreslila správně, je potřeba nastavit xml:lang.

Následující obrázek ukazuje příklad s přidaným kódem xml:lang .

Obrázek znázorňující arabské čísla, která proudí zprava doleva

Následující příklad přidá xml:lang do aplikace.

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

Mějte na paměti, že mnoho jazyků má různé xml:lang hodnoty v závislosti na cílové oblasti, "ar-SA" například a "ar-EG" představují dvě varianty arabštiny. Předchozí příklady ukazují, že je potřeba definovat jak hodnoty xml:lang, tak hodnoty FlowDirection.

FlowDirection s netextovými prvky

FlowDirection definuje nejen tok textu v textovém prvku, ale také směr toku téměř všech ostatních prvků uživatelského rozhraní. Následující graf zobrazuje ToolBar, který používá vodorovný LinearGradientBrush k vykreslení pozadí s přechodem zleva doprava.

Obrázek znázorňující panel nástrojů s přechodem zleva doprava

Po nastavení FlowDirection na RightToLeft, nejen ToolBar tlačítka jsou uspořádána zprava doleva, ale i LinearGradientBrush přeskupí své posuny, aby proudily zprava doleva.

Následující obrázek znázorňuje přeskupení LinearGradientBrush.

Obrázek znázorňující panel nástrojů s přechodem zprava doleva

Následující příklad nakreslí RightToLeftToolBar. (Pokud ho chcete nakreslit zleva doprava, odeberte FlowDirection atribut na kartě 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>

Výjimky směru toku

Existuje několik případů, kdy FlowDirection se nechová podle očekávání. Tato část se věnuje dvěma těmto výjimkám.

Obrázek

Image představuje ovládací prvek, který zobrazuje obrázek. V JAZYCE XAML se dá použít s Source vlastností, která definuje identifikátor URI (Uniform Resource Identifier) objektu, který Image se má zobrazit.

Na rozdíl od jiných prvků uživatelského rozhraní Image nezdědí FlowDirection z kontejneru. Pokud je však FlowDirection nastavena explicitně na RightToLeft, Image je zobrazen vodorovně převrácený. Tato funkce je implementována jako praktická funkce pro vývojáře obousměrného obsahu; vzhledem k tomu, že v některých případech vodorovně překlopíte obrázek, vznikne požadovaný efekt.

Následující obrázek znázorňuje překlopený Image.

Obrázek znázorňující překlopený obrázek

Následující příklad ukazuje, že Image nedokáže dědit FlowDirection z StackPanel, které ho obsahuje.

Poznámka:

Abyste mohli tento příklad spustit, musíte mít na jednotce C:\ soubor s názvem ms_logo.jpg .

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

Poznámka:

Součástí souborů ke stažení je souborms_logo.jpg . Kód předpokládá, že soubor .jpg není uvnitř projektu, ale někde na jednotce C:\. Musíte zkopírovat .jpg ze souborů projektu na jednotku C:\ nebo změnit kód tak, aby hledal soubor uvnitř projektu. Chcete-li to změnit Source="file://c:/ms_logo.jpg" na Source="ms_logo.jpg".

cesty

Kromě Image, další zajímavý prvek je Path. Cesta je objekt, který může nakreslit řadu propojených čar a křivek. Chová se podobným způsobem jako Image v souvislosti s jeho FlowDirection; například jeho RightToLeftFlowDirection je vodorovným zrcadlem jeho LeftToRight . Na rozdíl od objektu Image, Path dědí jeho FlowDirection z kontejneru a není nutné jej explicitně specifikovat.

Následující příklad nakreslí jednoduchou šipku pomocí 3 čar. První šipka přebírá směr toku od RightToLeft, takže její počáteční a koncové body jsou měřeny od kořene na pravé straně. Druhá šipka, která má explicitní označení RightToLeftFlowDirection, také začíná na pravé straně. Třetí šipka má však svůj počáteční kořen na levé straně. Další informace o výkresu naleznete LineGeometry a 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>

Následující obrázek ukazuje výstup předchozího příkladu se šipkami nakreslenými pomocí elementu Path :

Obrázek znázorňující šipky nakreslené pomocí prvku Path

Image a Path jsou dva příklady toho, jak WPF používá FlowDirection. Kromě rozmístění prvků uživatelského rozhraní ve specifickém směru v kontejneru, lze FlowDirection použít s prvky jako InkPresenter, které vykreslují inkoust na povrchu, LinearGradientBrush a RadialGradientBrush. Kdykoli potřebujete chování zprava doleva pro obsah, které napodobuje chování zleva doprava nebo naopak, windows Presentation Foundation (WPF) tuto funkci poskytuje.

Nahrazení čísel

Systém Windows v minulosti podporoval nahrazení čísel tím, že umožňuje reprezentaci různých kulturních obrazců pro stejné číslice a zachování vnitřního úložiště těchto číslic sjednocených mezi různými národními prostředími, například čísla jsou uložena v jejich dobře známých šestnáctkových hodnotách, 0x40, 0x41, ale zobrazují se podle vybraného jazyka.

To umožňuje aplikacím zpracovávat číselné hodnoty, aniž by je bylo nutné převést z jednoho jazyka na jiný, například uživatel může otevřít tabulku Aplikace Microsoft Excel v lokalizovaných arabských systémech Windows a zobrazit čísla tvarovaná v arabštině, ale otevřít je v evropské verzi Systému Windows a zobrazit evropské vyjádření stejných čísel. To je také nezbytné pro jiné symboly, jako jsou oddělovače čárk a symbol procenta, protože obvykle doprovázejí čísla ve stejném dokumentu.

Windows Presentation Foundation (WPF) pokračuje ve stejné tradici a přidává další podporu této funkce, která umožňuje větší kontrolu uživatelů nad tím, kdy a jak se nahrazení používá. I když je tato funkce navržená pro libovolný jazyk, je zvlášť užitečná v obousměrném obsahu, kde tvarování číslic pro konkrétní jazyk je obvykle výzvou pro vývojáře aplikací kvůli různým jazykovým verzím, na kterých může aplikace běžet.

Základní vlastnost určující, jak nahrazení čísel funguje ve Windows Presentation Foundation (WPF) je Substitution vlastnost závislosti. Třída NumberSubstitution určuje, jak se mají zobrazovat čísla v textu. Má tři veřejné vlastnosti, které definují jeho chování. Následuje souhrn jednotlivých vlastností:

CultureSource:

Tato vlastnost určuje, jak je stanovena kultura pro čísla. Přebírá jednu ze tří NumberCultureSource hodnot výčtu.

CultureOverride:

Vlastnost CultureOverride se používá pouze v případě, že je vlastnost CultureSource nastavena na Override, a je jinak ignorována. Určuje kulturní formátování čísel. Hodnota null, výchozí hodnota, je interpretována jako en-US.

Náhrada:

Tato vlastnost určuje typ nahrazení čísla, který se má provést. Přebírá jednu z následujících NumberSubstitutionMethod hodnot výčtu:

  • AsCulture: Metoda nahrazení je stanovena na základě vlastnosti číslicové kultury NumberFormatInfo.DigitSubstitution. Toto je výchozí hodnota.

  • Context: Pokud je číselná kultura arabská nebo perská, znamená to, že číslice závisí na kontextu.

  • European: Čísla se vždy vykreslují jako evropské číslice.

  • NativeNational: Čísla se vykreslují pomocí národních číslic pro kulturní verzi číslic, jak je určeno verzí NumberFormat.

  • Traditional: Čísla se zobrazují pomocí tradičních číslic pro kulturu čísel. Pro většinu kultur je to stejné jako NativeNational. NativeNational Výsledkem jsou však číslice latinky pro některé arabské jazykové verze, zatímco tato hodnota má za následek arabské číslice pro všechny arabské jazykové verze.

Co tyto hodnoty znamenají pro obousměrného vývojáře obsahu? Ve většině případů může vývojář potřebovat definovat FlowDirection a jazyk každého textového prvku uživatelského rozhraní, například Language="ar-SA" logika NumberSubstitution se postará o zobrazení čísel podle správného uživatelského rozhraní. Následující příklad ukazuje použití arabských a anglických čísel v aplikaci Windows Presentation Foundation (WPF) běžící v arabské verzi Systému 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>

Následující obrázek ukazuje výstup předchozí ukázky, pokud používáte arabské verze Windows s arabskými a anglickými čísly:

Obrázek znázorňující arabské a anglické číslování

Bylo důležité mít FlowDirection v tomto případě, protože nastavení FlowDirection na LeftToRight by místo toho vedlo k evropským číslicím. V následujících částech se dozvíte, jak mít jednotné zobrazení číslic v celém dokumentu. Pokud tento příklad není spuštěný v arabském systému Windows, zobrazí se všechny číslice jako evropské číslice.

Definování pravidel nahrazení

V reálné aplikaci možná budete muset nastavit jazyk programově. Například chcete nastavit xml:lang , aby byl atribut stejný jako atribut používaný uživatelským rozhraním systému, nebo můžete změnit jazyk v závislosti na stavu aplikace.

Pokud chcete provádět změny v závislosti na stavu aplikace, použijte další funkce, které poskytuje Windows Presentation Foundation (WPF).

Nejprve nastavte komponentu NumberSubstitution.CultureSource="Text"aplikace . Použití tohoto nastavení zajistí, že nastavení nepochází z uživatelského rozhraní pro textové prvky, které mají jako výchozí hodnotu "Uživatel", například TextBlock.

Například:

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

V odpovídajícím kódu jazyka C# nastavte vlastnost, například na Language.

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

Pokud potřebujete nastavit Language vlastnost na jazyk uživatelského rozhraní aktuálního uživatele, použijte následující kód.

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

CultureInfo.CurrentCulture představuje aktuální kulturu používanou aktuálním vláknem během provádění.

Konečný příklad XAML by se měl podobat následujícímu příkladu.

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

Konečný příklad jazyka C# by se měl podobat následujícímu příkladu.

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

Následující obrázek ukazuje, jak okno vypadá pro některý programovací jazyk a zobrazuje arabské čísla:

Obrázek, který zobrazuje arabské čísla

Použití vlastnosti nahrazení

Způsob, jakým nahrazení čísel funguje ve Windows Presentation Foundation (WPF) závisí na jazyce textového prvku a jeho FlowDirection. Pokud je FlowDirection orientováno zleva doprava, zobrazí se evropské číslice. Pokud je však předchází arabský text, nebo má jazyk nastavený na "ar" a FlowDirection je RightToLeft, místo toho se vykreslí arabské číslice.

V některých případech ale můžete chtít vytvořit jednotnou aplikaci, například evropské číslice pro všechny uživatele. Nebo arabské číslice v Table buňkách s určitým Style znakem. Jedním ze snadných způsobů, jak to udělat, je použití Substitution vlastnosti.

V následujícím příkladu první TextBlock nemá nastavenou Substitution vlastnost, takže algoritmus zobrazí arabské číslice podle očekávání. Ve druhém TextBlock, případě je však náhrada nastavena na evropskou náhradou, čímž přepisuje výchozí náhradu arabských číslic, a zobrazí se evropské číslice.

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