Compartir a través de


Características bidireccionales en la descripción general de WPF

A diferencia de cualquier otra plataforma de desarrollo, WPF tiene muchas características que admiten el desarrollo rápido de contenido bidireccional, por ejemplo, datos mixtos de izquierda a derecha y derecha a izquierda en el mismo documento. Al mismo tiempo, WPF crea una excelente experiencia para los usuarios que requieren características bidireccionales, como los usuarios de habla árabe y hebreo.

En las secciones siguientes se explican muchas características bidireccionales junto con ejemplos que ilustran cómo lograr la mejor presentación del contenido bidireccional. La mayoría de los ejemplos usan XAML, aunque puedes aplicar fácilmente los conceptos a código de C# o Microsoft Visual Basic.

FlowDirection

La propiedad básica que define la dirección del flujo de contenido en una aplicación WPF es FlowDirection. Esta propiedad se puede establecer en uno de los dos valores de enumeración, LeftToRight o RightToLeft. La propiedad está disponible para todos los elementos de WPF que heredan de FrameworkElement.

En los ejemplos siguientes se establece la dirección del flujo de un TextBox elemento.

Dirección del flujo de izquierda a derecha

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

Dirección del flujo de derecha a izquierda

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

En el gráfico siguiente se muestra cómo se representa el código anterior.

Gráfico que muestra las distintas direcciones de flujo.

Un elemento dentro de un árbol de interfaz de usuario heredará FlowDirection del contenedor. En el ejemplo siguiente, el TextBlock está dentro de un Grid, que reside en un Window. Establecer el FlowDirection para el Window implica establecerlo también para el Grid y el TextBlock.

En el ejemplo siguiente se muestra cómo establecer 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>

El nivel Window superior tiene un RightToLeftFlowDirection, por lo que todos los elementos contenidos en él también heredan el mismo FlowDirection. Para que un elemento invalide un especificado FlowDirection , debe agregar un cambio de dirección explícito, como el segundo TextBlock del ejemplo anterior, que cambia a LeftToRight. Cuando no se define FlowDirection, se aplica LeftToRight por defecto.

En el gráfico siguiente se muestra la salida del ejemplo anterior:

Gráfico que muestra el cambio explícito de la dirección del flujo.

FlowDocument

Muchas plataformas de desarrollo como HTML, Win32 y Java proporcionan compatibilidad especial para el desarrollo de contenido bidireccional. Los lenguajes de marcado como HTML proporcionan a los escritores de contenido el marcado necesario para mostrar texto en cualquier dirección necesaria, por ejemplo, la etiqueta HTML 4.0, "dir" que toma "rtl" o "ltr" como valores. Esta etiqueta es similar a la FlowDirection propiedad , pero la FlowDirection propiedad funciona de forma más avanzada para diseñar contenido textual y se puede usar para el contenido que no sea texto.

Un elemento de la UI que puede hospedar una combinación de texto, tablas, imágenes y otros elementos. Los ejemplos de las secciones siguientes usan este elemento.

La adición de texto a un FlowDocument puede realizarse de más de una forma. Una manera sencilla de hacerlo es a través de un Paragraph elemento de nivel de bloque que se usa para agrupar contenido como texto. Para agregar texto a los elementos en línea, los ejemplos usan Span y Run. Span es un elemento de contenido de flujo en línea que se usa para agrupar otros elementos en línea, mientras que un Run es un elemento de contenido de flujo en línea destinado a contener una secuencia de texto sin formato. Un Span puede contener varios Run elementos.

El primer ejemplo de documento contiene un documento que tiene varios nombres de recurso compartido de red; por ejemplo \\server1\folder\file.ext, . Ya sea que tenga este vínculo de red en un documento árabe o inglés, siempre quiere que aparezca de la misma manera. En el gráfico siguiente se muestra el uso del elemento Span y se muestra el vínculo en un documento árabe RightToLeft :

Gráfico que muestra el uso del elemento Span.

Dado que el texto es RightToLeft, todos los caracteres especiales, como "\", separan el texto en un orden de derecha a izquierda. Esto da como resultado que el vínculo no se muestre en el orden correcto, por lo que para resolver el problema, el texto debe estar incrustado para conservar un flujo RunindependienteLeftToRight. En lugar de tener un Run independiente para cada idioma, una mejor manera de resolver el problema es insertar el texto en inglés menos usado en un Span árabe más grande.

En el gráfico siguiente se muestra esto mediante el elemento Run incrustado en un elemento Span:

Gráfico que muestra el elemento Run incrustado en un elemento Span.

En el siguiente ejemplo se demuestra el uso de los elementos Run y Span en documentos.

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

Elementos Span

El Span elemento funciona como separador de límites entre textos con diferentes direcciones de flujo. Incluso los Span elementos con la misma dirección de flujo se consideran tener ámbitos bidireccionales diferentes, lo que significa que en el Span del contenedor, los FlowDirection elementos están ordenados, y solo el contenido dentro del Span elemento sigue el FlowDirection del Span.

En el gráfico siguiente se muestra la dirección de flujo de varios TextBlock elementos.

Gráfico que muestra bloques de texto con diferentes direcciones de flujo.

En el ejemplo siguiente se muestra cómo usar los Span elementos y Run para generar los resultados mostrados en el gráfico anterior.

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

En los TextBlock elementos de la muestra, los Span elementos se colocan de acuerdo con el FlowDirection de sus progenitores, pero el texto de cada Span elemento fluye conforme a su propio FlowDirection. Esto es aplicable a latín y al árabe, o a cualquier otro idioma.

Adición de xml:lang

En el gráfico siguiente se muestra otro ejemplo que usa números y expresiones aritméticas, como "200.0+21.4=221.4". Tenga en cuenta que solo se establece el FlowDirection.

Gráfico que muestra números que usan solo FlowDirection.

Los usuarios de esta aplicación estarán decepcionados por el resultado, aunque el FlowDirection sea correcto, los números no están formados como deberían estarlo según el sistema de numeración árabe.

Los elementos XAML pueden incluir un atributo XML (xml:lang) que define el lenguaje de cada elemento. XAML también admite un principio del lenguaje XML en el cual los valores aplicados a los elementos primarios en el árbol son utilizados por los elementos secundarios. En el ejemplo anterior, porque no se definió un lenguaje para el Run elemento o para ninguno de sus elementos de nivel superior, se usó el valor predeterminado xml:lang , que es en-US para XAML. El algoritmo de forma de número interno de Windows Presentation Foundation (WPF) selecciona números en el idioma correspondiente, en este caso inglés. Para que los números árabes se representen correctamente xml:lang debe establecerse.

En el gráfico siguiente se muestra el ejemplo con xml:lang agregado.

Gráfico que ilustra los números árabes que fluyen de derecha a izquierda.

En el ejemplo siguiente se agrega xml:lang a la aplicación.

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

Tenga en cuenta que muchos idiomas tienen valores diferentes xml:lang en función de la región de destino, por ejemplo, "ar-SA" y "ar-EG" representan dos variaciones del árabe. Los ejemplos anteriores ilustran que necesita definir tanto los valores de xml:lang como los de FlowDirection.

FlowDirection con elementos que no son de texto

FlowDirection define no solo cómo fluye el texto en un elemento textual, sino también la dirección de flujo de casi todos los demás elementos de la interfaz de usuario. En el gráfico siguiente se muestra un ToolBar que usa un LinearGradientBrush horizontal para dibujar su fondo con un degradado de izquierda a derecha.

Gráfico que muestra una barra de herramientas con un degradado de izquierda a derecha.

Después de establecer el FlowDirection en RightToLeft, no solo los botones ToolBar se organizan de derecha a izquierda, sino que incluso sus compensaciones se realinean para fluir de derecha a izquierda.

En el siguiente gráfico se muestra la realineación del LinearGradientBrush.

Gráfico que muestra una barra de herramientas con un degradado de derecha a izquierda.

En el ejemplo siguiente se dibuja un RightToLeftToolBar. (Para dibujarlo de izquierda a derecha, quite el atributo FlowDirection en el 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>

Excepciones de FlowDirection

Hay algunos casos en los cuales FlowDirection no se comporta según lo esperado. En esta sección se tratan dos de estas excepciones.

Imagen

Image representa un control que muestra una imagen. En XAML se puede usar con una Source propiedad que define el identificador uniforme de recursos (URI) del Image que se mostrará.

A diferencia de otros elementos de la interfaz de usuario, un Image no hereda el FlowDirection del contenedor. Sin embargo, si el FlowDirection se establece explícitamente en RightToLeft, se muestra un Image volteado horizontalmente. Esto se implementa como una característica cómoda para los desarrolladores de contenido bidireccional; dado que, en algunos casos, voltear horizontalmente la imagen produce el efecto deseado.

En el gráfico siguiente se presenta un invertido Image.

Gráfico que muestra una imagen volteada.

En el ejemplo siguiente se demuestra que el Image no hereda el FlowDirection de StackPanel, que lo contiene.

Nota:

Debe tener un archivo denominado ms_logo.jpg en la unidad C:\ para ejecutar este ejemplo.

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

Nota:

Incluido en los archivos de descarga está un archivo ms_logo.jpg. El código supone que el archivo .jpg no está dentro del proyecto, sino en algún lugar de la unidad C:\. Debe copiar el .jpg desde los archivos del proyecto a su unidad C:\, o modificar el código para que busque el archivo dentro del proyecto. Para ello, cambie Source="file://c:/ms_logo.jpg" a Source="ms_logo.jpg".

Caminos

Además de un Image, otro elemento interesante es Path. Path es un objeto que puede dibujar una serie de líneas y curvas conectadas. Se comporta de forma similar a una Image con respecto a su FlowDirection; por ejemplo, su RightToLeftFlowDirection es un reflejo horizontal de su LeftToRight uno. Sin embargo, a diferencia de un Image, Path hereda su FlowDirection del contenedor y no es necesario especificarlo explícitamente.

En el ejemplo siguiente se dibuja una flecha simple con 3 líneas. La primera flecha hereda la dirección de flujo RightToLeft de StackPanel de modo que sus puntos iniciales y finales se midan a partir de una raíz en el lado derecho. La segunda flecha que tiene un explícito RightToLeftFlowDirection también comienza en el lado derecho. Sin embargo, la tercera flecha tiene su raíz inicial en el lado izquierdo. Para obtener más información sobre el dibujo, vea LineGeometry y 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>

En el gráfico siguiente se muestra la salida del ejemplo anterior con flechas dibujadas mediante el Path elemento :

Gráfico que muestra las flechas dibujadas mediante el elemento Path.

Image y Path son dos ejemplos de cómo WPF usa FlowDirection. Además de organizar los elementos de la interfaz de usuario en una dirección específica dentro de un contenedor, FlowDirection se puede usar con elementos como InkPresenter, que aplica tinta en una superficie, LinearGradientBrush, RadialGradientBrush. Siempre que necesite un comportamiento de derecha a izquierda para el contenido que imita un comportamiento de izquierda a derecha, o viceversa, Windows Presentation Foundation (WPF) proporciona esa funcionalidad.

Sustitución de números

Históricamente, Windows ha admitido la sustitución de números al permitir la representación de diferentes formas culturales para los mismos dígitos, al tiempo que mantiene el almacenamiento interno de estos dígitos unificado entre diferentes configuraciones regionales, por ejemplo, los números se almacenan en sus valores hexadecimales conocidos, 0x40, 0x41, pero se muestran según el idioma seleccionado.

Esto ha permitido que las aplicaciones procesen valores numéricos sin necesidad de convertirlos de un idioma a otro, por ejemplo, un usuario puede abrir una hoja de cálculo de Microsoft Excel en una ventana árabe localizada y ver los números con forma en árabe, pero abrirlos en una versión europea de Windows y ver la representación europea de los mismos números. Esto también es necesario para otros símbolos, como separadores de comas y símbolos de porcentaje, ya que normalmente acompañan números en el mismo documento.

Windows Presentation Foundation (WPF) continúa la misma tradición y agrega compatibilidad adicional con esta característica que permite un mayor control de usuario sobre cuándo y cómo se usa la sustitución. Aunque esta característica está diseñada para cualquier lenguaje, resulta especialmente útil en el contenido bidireccional en el que dar forma a dígitos para un lenguaje específico suele ser un desafío para los desarrolladores de aplicaciones debido a las diversas referencias culturales en las que se puede ejecutar una aplicación.

La propiedad principal que controla cómo funciona la sustitución de números en Windows Presentation Foundation (WPF) es la Substitution propiedad de dependencia. La NumberSubstitution clase especifica cómo se muestran los números del texto. Tiene tres propiedades públicas que definen su comportamiento. A continuación se muestra un resumen de cada una de las propiedades:

CultureSource:

Esta propiedad especifica cómo se determina la cultura de los números. Toma uno de los tres NumberCultureSource valores de enumeración.

CultureOverride:

La CultureOverride propiedad solo se usa si la CultureSource propiedad está establecida en Override y se omite de lo contrario. Especifica la cultura numérica. Un valor de null, el valor predeterminado, se interpreta como en-US.

Sustitución:

Esta propiedad especifica el tipo de sustitución de números que se va a realizar. Toma uno de los siguientes NumberSubstitutionMethod valores de enumeración:

  • AsCulture: El método de sustitución se determina en función de la propiedad NumberFormatInfo.DigitSubstitution de la cultura numérica. Este es el valor predeterminado.

  • Context: si la referencia cultural numérica es una referencia cultural árabe o persa, especifica que los dígitos dependen del contexto.

  • European: los números siempre se representan como dígitos europeos.

  • NativeNational: los números se representan mediante los dígitos nacionales del formato numérico cultural, según lo especificado por la referencia cultural de NumberFormat.

  • Traditional: Los números se representan mediante los dígitos tradicionales para la cultura numérica. Para la mayoría de las culturas, esto es lo mismo que NativeNational. Sin embargo, NativeNational da como resultado dígitos latinos para algunas referencias culturales árabes, mientras que este valor da como resultado dígitos árabes para todas las referencias culturales árabes.

¿Qué significan esos valores para un desarrollador de contenido bidireccional? En la mayoría de los casos, es posible que el desarrollador solo necesite definir FlowDirection y el idioma de cada elemento de interfaz de usuario textual, por ejemplo Language="ar-SA" , y la NumberSubstitution lógica se encarga de mostrar los números según la interfaz de usuario correcta. En el ejemplo siguiente se muestra el uso de números en árabe e inglés en una aplicación de Windows Presentation Foundation (WPF) que se ejecuta en una versión árabe de 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>

En el gráfico siguiente se muestra la salida del ejemplo anterior si se ejecuta en una versión árabe de Windows con números en árabe e inglés mostrados:

Gráfico que muestra números árabe e inglés.

FlowDirection era importante en este caso porque establecer FlowDirection a LeftToRight en su lugar habría producido dígitos europeos. En las secciones siguientes se describe cómo tener una presentación unificada de dígitos en todo el documento. Si este ejemplo no se ejecuta en Windows árabe, todos los dígitos se muestran como dígitos europeos.

Definición de reglas de sustitución

En una aplicación real, es posible que tenga que establecer el lenguaje mediante programación. Por ejemplo, quiere establecer el xml:lang atributo para que sea el mismo que el que usa la interfaz de usuario del sistema, o puede cambiar el idioma en función del estado de la aplicación.

Si quieres realizar cambios en función del estado de la aplicación, usa otras características proporcionadas por Windows Presentation Foundation (WPF).

En primer lugar, establezca el componente de aplicación NumberSubstitution.CultureSource="Text". Con esta configuración se garantiza que los ajustes no provienen de la interfaz de usuario para los elementos de texto que tienen "User" como valor predeterminado, como TextBlock.

Por ejemplo:

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

En el código de C# correspondiente, establezca la Language propiedad , por ejemplo, en "ar-SA".

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

Si necesita establecer la Language propiedad en el idioma de la interfaz de usuario del usuario actual, use el código siguiente.

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

CultureInfo.CurrentCulture representa la cultura actual usada por el subproceso actual en tiempo de ejecución.

El ejemplo de XAML final debe ser similar al ejemplo siguiente.

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

El ejemplo final de C# debe ser similar al siguiente.

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

En el gráfico siguiente se muestra el aspecto de la ventana para cualquier lenguaje de programación, mostrando números árabes:

Gráfico que muestra números árabes.

Uso de la propiedad de sustitución

La forma en que funciona la sustitución de números en Windows Presentation Foundation (WPF) depende del lenguaje del elemento de texto y de su FlowDirection. Si FlowDirection es de izquierda a derecha, entonces se muestran los dígitos europeos. Sin embargo, si va precedido por texto árabe, o tiene el idioma establecido en "ar" y FlowDirection es RightToLeft, los dígitos árabes se representan en su lugar.

Sin embargo, en algunos casos, es posible que desee crear una aplicación unificada, por ejemplo, dígitos europeos para todos los usuarios. O dígitos arábigos en Table celdas con un determinado Style. Una manera sencilla de hacerlo es usar la Substitution propiedad .

En el ejemplo siguiente, el primero TextBlock no tiene establecida la Substitution propiedad , por lo que el algoritmo muestra los dígitos árabes según lo previsto. Sin embargo, en el segundo TextBlock, la sustitución se establece en Europeo reemplazando la sustitución predeterminada para los números árabes y se muestran los dígitos europeos.

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