Vue d'ensemble des fonctionnalités bidirectionnelles dans WPF
Mise à jour : novembre 2007
Contrairement aux autres plateformes de développement, WPF propose de nombreuses fonctionnalités qui prennent en charge le développement rapide de contenu bidirectionnel, par exemple des données de gauche à droite et de droite à gauche mélangées dans le même document. Parallèlement, WPF crée une excellente expérience pour les utilisateurs qui ont besoin de fonctionnalités bidirectionnelles tels que les utilisateurs de langue arabe et hébreu.
Les sections suivantes expliquent de nombreuses fonctionnalités bidirectionnelles, accompagnées d'exemples qui illustrent comment réaliser le meilleur affichage de contenu bidirectionnel. La plupart des exemples utilisent XAML, vous pouvez cependant facilement appliquer ces concepts à du code C# ou Microsoft Visual Basic.
Cette rubrique comprend les sections suivantes.
- FlowDirection
- FlowDocument
- Éléments Span
- FlowDirection avec des éléments autres que textuels
- Substitution de nombres
FlowDirection
La propriété de base qui définit le sens de déroulement du contenu dans une application WPF est FlowDirection. Cette propriété peut avoir une des deux valeurs d'énumération, LeftToRight ou RightToLeft. Cette propriété est disponible pour tous les éléments WPF qui héritent de FrameworkElement.
Remarque : |
---|
Tous les graphiques de cette rubrique présentent le code ainsi que la façon dont il gère le rendu dans l'outil XAMLPad. Un exemple, que vous pouvez télécharger, vous est également fourni pour presque tous les cas. |
Les exemples suivants définissent le sens de déroulement d'un élément TextBox.
Sens de déroulement de gauche à droite
<TextBlock Background="DarkBlue" Foreground="LightBlue"
FontSize="20" FlowDirection="LeftToRight">
This is a left-to-right TextBlock
</TextBlock>
Sens de déroulement de droite à gauche
<TextBlock Background="LightBlue" Foreground="DarkBlue"
FontSize="20" FlowDirection="RightToLeft">
This is a right-to-left TextBlock
</TextBlock>
Pour obtenir un exemple complet, consultez LeftToRight et RightToLeft, exemple.
Le graphique suivant montre le rendu généré par le code précédent.
Graphique illustrant FlowDirection
Un élément au sein d'une arborescence d'interface utilisateur (UI) héritera de la propriété FlowDirection de son conteneur. Dans l'exemple suivant, le TextBlock est à l'intérieur d'un contrôle Grid, qui réside dans une Window. Définir FlowDirection pour Window implique de le définir pour Grid ainsi que pour TextBlock.
L'exemple suivant montre comment définir la propriété 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>
La Window de niveau supérieur a un FlowDirectionRightToLeft, tous les éléments contenus dans celui-ci héritent ainsi également du même FlowDirection. Pour qu'un élément substitue un FlowDirection spécifié, il doit ajouter une modification de sens explicite, comme le deuxième TextBlock de l'exemple précédent qui le modifie en LeftToRight. Lorsque aucun FlowDirection n'est défini, la valeur par défaut LeftToRight s'applique.
Pour obtenir un exemple complet, consultez FlowDirection, exemple.
Le graphique suivant montre la sortie produite par l'exemple précédent.
Graphique illustrant FlowDirection assigné explicitement
FlowDocument
De nombreuses plateformes de développement telles que HTML, Win32 et Java™ fournissent une prise en charge spéciale du développement de contenu bidirectionnel. Les langages de balisage tels que HTML procurent aux rédacteurs de contenu le balisage nécessaire pour afficher du texte dans n'importe quel sens requis, par exemple la balise HTML 4.0 "dir", qui prend les valeurs "rtl" ou "ltr". Cette balise est similaire à la propriété FlowDirection, mais la propriété FlowDirection a un fonctionnement plus avancé en ce qui concerne la disposition de contenu textuel et elle peut être utilisée pour du contenu autre que du texte.
Dans WPF, un FlowDocument est un élément d'interface utilisateur polyvalent qui peut héberger une combinaison de texte, tableaux, images et autres éléments. Les exemples des sections suivantes utilisent cet élément.
L'ajout de texte à un FlowDocument peut être effectué de plusieurs façons. Ceci peut être réalisé simplement à l'aide d'un Paragraph qui est un élément au niveau bloc utilisé pour grouper du contenu tel que du texte. Pour ajouter du texte à des éléments inclus les exemples utilisent Span et Run. Span est un élément inclus de contenu de flux utilisé pour grouper d'autres éléments inclus, tandis qu'un Run est un élément inclus de contenu de flux destiné à contenir une exécution de texte non formaté. Un Span peut contenir plusieurs éléments Run.
Le premier exemple de document contient un document qui a plusieurs noms de partage réseau ; par exemple \\server1\folder\file.ext. Que ce lien réseau soit dans un document en arabe ou en anglais, vous souhaiterez toujours qu'il apparaisse de la même façon. Le graphique suivant montre le lien dans un document RightToLeft en arabe.
Graphique illustrant l'utilisation de l'élément Span
Le texte étant dans le sens RightToLeft, tous les caractères spéciaux, tel que "\", séparent le texte dans un ordre qui va de droite à gauche. Il en résulte que le lien n'est pas affiché dans le bon ordre, et que par conséquent, pour résoudre le problème, le texte doit être incorporé afin de conserver un Run séparé se déroulant dans le sens LeftToRight. Au lieu d'avoir un Run séparé pour chaque langue, une meilleure façon de résoudre le problème est d'incorporer le texte anglais, qui est le moins souvent utilisé, dans un Span de plus grande taille en langue arabe.
C'est ce que montre le graphique suivant :
Graphique illustrant l'utilisation d'un élément Run incorporé dans un élément Span
L'exemple suivant montre comment utiliser les éléments Run et Span dans des documents.
<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>
Pour obtenir un exemple complet, consultez RunSpan, exemple.
Éléments Span
L'élément Span fonctionne comme une limite qui sépare les textes qui ont des sens de déroulement différents. Même les éléments Span qui ont un sens de déroulement identique sont considérés comme ayant des portées bidirectionnelles différentes, ce qui signifie que les éléments Span sont ordonnés dans le FlowDirection du conteneur, et que seul le contenu à l'intérieur de l'élément Span suit le FlowDirection du Span.
Le graphique suivant montre le sens de déroulement de plusieurs éléments TextBlock.
Graphique illustrant FlowDirection dans plusieurs éléments TextBlock
L'exemple suivant montre comment utiliser les éléments Span et Run pour produire les résultats affichés dans le graphique précédent.
<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>
Pour obtenir un exemple de code complet, consultez Span, exemple.
Dans les éléments TextBlock de l'exemple, les éléments Span sont disposés selon le FlowDirection de leurs parents, mais le texte situé à l'intérieur de chaque élément Span se déroule dans son FlowDirection propre. Ceci s'applique au latin et à l'arabe ou à toute autre langue.
Ajout de xml:lang
Le graphique suivant montre un autre exemple qui utilise des nombres et des expressions arithmétiques, telles que "200.0+21.4=221.4". Notez que seul FlowDirection est défini.
Graphique affichant des nombres en utilisant uniquement FlowDirection
Les utilisateurs de cette application seront déçus par la sortie du résultat, car bien que FlowDirection soit correct, les nombres ne sont pas formés comme des nombres arabes devraient l'être.
Les éléments XAML héritent d'une propriété XML appelée Gestion de xml:lang en XAML (son alias étant Language) qui définit la langue de chaque élément. Dans l'exemple précédent, du fait que la langue n'était pas définie pour l'élément Run ni pour aucun de ses éléments de niveau supérieur, la langue par défaut a été utilisée, c'est à dire en-US. L'algorithme interne de Windows Presentation Foundation (WPF) de mise en forme des nombres sélectionne les nombres dans la langue correspondante, dans ce cas l'anglais. Pour que les nombres arabes soient rendus de manière correcte, Gestion de xml:lang en XAML (Language) doit être défini.
Le graphique suivant montre l'exemple une fois la propriété Language ajoutée.
Graphique illustrant l'utilisation de l'attribut xml:lang
L'exemple suivant ajoute Gestion de xml:lang en XAML (Language) à l'application.
<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>
Pour obtenir un exemple complet, consultez LanguageAttribute, exemple.
N'oubliez pas que de nombreuses langues ont différentes valeurs de Language selon la région ciblée, par exemple « ar-SA » et « ar-EG » représentent deux variantes de l'arabe. Les exemples précédents montrent que vous avez besoin de définir les deux propriétés, Language (xml:lang) et FlowDirection.
FlowDirection avec des éléments autres que textuels
FlowDirection définit non seulement comment le texte se déroule dans un élément textuel, mais également le sens de déroulement de presque tous les éléments de l'interface utilisateur. Le graphique suivant montre un ToolBar qui utilise un LinearGradientBrush horizontal pour dessiner son arrière-plan.
Graphique montrant une barre d'outils avec un dégradé de gauche à droite
Après l'affectation de RightToLeft à FlowDirection, non seulement les boutons de ToolBar sont organisés de droite à gauche, mais LinearGradientBrush réaligne même ses offsets pour qu'ils se déroulent de droite à gauche.
Le graphique suivant illustre le réalignement de LinearGradientBrush.
Graphique montrant une barre d'outils avec un dégradé de droite à gauche
L'exemple suivant dessine un ToolBar de sens RightToLeft. (Pour le dessiner de gauche à droite, supprimez l'attribut FlowDirection sur le 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>
Pour obtenir un exemple complet, consultez Dégradé, exemple.
Exceptions de FlowDirection
Il existe quelques cas où FlowDirection ne se comporte pas comme prévu. Cette section décrit deux de ces exceptions.
Image
Une Image représente un contrôle qui affiche une image. En XAML, elle peut être utilisée avec une propriété Source qui définit l'URI (Uniform Resource Identifier) de l'Image à afficher.
Contrairement aux autres éléments de l' interface utilisateur, une Image n'hérite pas du FlowDirection de son conteneur. Cependant, si le FlowDirection a explicitement la valeur RightToLeft, une Image s'affiche retournée horizontalement. Cette implémentation est une fonctionnalité pratique pour les développeurs de contenu bidirectionnel, parce que dans certains cas, le fait de retourner l'image horizontalement produit l'effet recherché.
Le graphique suivant affiche une Image retournée.
Graphique illustrant une image retournée
L'exemple suivant montre que l'Image ne réussit pas à hériter du FlowDirection du StackPanel qui la contient. Remarque vous devez avoir un fichier nommé ms_logo.jpg sur votre lecteur C:\ pour exécuter cet exemple.
<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>
Pour obtenir un exemple complet, consultez Image, exemple. Remarque un fichier ms_logo.jpg est inclus dans les fichiers à télécharger. Le code suppose que le fichier .jpg n'est pas à l'intérieur de votre projet mais quelque part sur le lecteur C:\. Vous devez copier le fichier .jpg depuis vos fichiers projet vers votre lecteur C:\ ou modifier le code afin qu'il recherche le fichier à l'intérieur du projet. Pour ce faire, modifiez Source="file://c:/ms_logo.jpg" en Source="ms_logo.jpg".
Tracés
En plus de Image, un autre élément intéressant est Path. Un tracé est un objet qui peut dessiner une série de lignes et de courbes connectées. Il se comporte de manière semblable à une Image en ce qui concerne son FlowDirection ; par exemple, un FlowDirection de valeur RightToLeft correspond à un miroir horizontal de son sens de déroulement LeftToRight. Cependant, contrairement à Image, Path hérite du FlowDirection du conteneur et il n'est pas nécessaire de le spécifier explicitement.
L'exemple suivant dessine une flèche simple à l'aide de 3 lignes. La première flèche hérite du sens de déroulement RightToLeft de StackPanel de telle sorte que ses points de début et de terminaison sont mesurés à partir d'une racine située sur le côté droit. La deuxième flèche qui a un FlowDirectionRightToLeft explicite débute également sur le côté droit. Cependant, la troisième flèche a sa racine de début située sur le côté gauche. Pour plus d'informations sur le dessin, consultez LineGeometry et 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>
Pour obtenir un exemple complet, consultez Path, exemple.
Le graphique suivant montre la sortie produite par l'exemple précédent.
Graphique illustrant des flèches dessinées à l'aide de l'élément Path
Image et Path sont deux exemples de la façon dont Windows Presentation Foundation (WPF) utilise FlowDirection. En plus de la disposition d'éléments de l'interface utilisateur dans un sens spécifique au sein d'un conteneur, FlowDirection peut être utilisé avec des éléments tels que InkPresenter, qui restitue de l'encre sur une surface, LinearGradientBrush, RadialGradientBrush. Si vous avez besoin d'un comportement de droite à gauche de votre contenu qui reproduit un comportement de gauche à droite ou inversement, Windows Presentation Foundation (WPF) vous fournit cette fonctionnalité.
Substitution de nombres
Historiquement, Windows a pris en charge la substitution de nombres en permettant la représentation de chiffres identiques sous des formes différentes selon la culture, tout en gardant un stockage interne de ces chiffres unifié entre les différents paramètres régionaux ; les nombres sont stockés dans leurs valeurs connues hexadécimales, par exemple 0x40, 0x41, mais affichés en fonction de la langue sélectionnée.
Ceci a permis aux applications de traiter les valeurs numériques sans avoir besoin de les convertir d'une langue à une autre ; un utilisateur peut par exemple ouvrir une feuille de calcul Microsoft Excel sur une version localisée en arabe de Windows et voir les nombres sous leur forme arabe, mais l'ouvrir sur une version européenne de Windows et voir ces mêmes nombres dans leur représentation européenne. Ceci est également nécessaire pour les autres symboles tels que les virgules et le symbole du pourcentage parce qu'ils accompagnent habituellement des nombres dans le même document.
Windows Presentation Foundation (WPF) continue dans la même tradition et ajoute une prise en charge supplémentaire de cette fonctionnalité qui permet un meilleur contrôle de l'utilisateur sur quand et comment la substitution est utilisée. Bien que cette fonctionnalité soit conçue pour n'importe quelle langue, elle est particulièrement utile pour du contenu bidirectionnel, où la mise en forme des chiffres est habituellement un défi pour les développeurs d'application du fait des différentes cultures dans lesquelles peut s'exécuter l'application.
La principale propriété qui contrôle comment la substitution de nombres fonctionne dans Windows Presentation Foundation (WPF) est la propriété de dépendance Substitution. La classe NumberSubstitution spécifie comment les nombres doivent être affichés dans le texte. Elle a trois propriétés publiques qui définissent son comportement. Voici un résumé de chacune de ces propriétés.
CultureSource :
Cette propriété spécifie la manière dont est déterminée la culture pour les nombres. Elle prend une des trois valeurs d'énumération NumberCultureSource.
Override : la culture pour les nombres est celle de la propriété CultureOverride.
Text : la culture pour les nombres est la culture de l'exécution de texte. Dans le balisage, ceci correspond à Gestion de xml:lang en XAML, ou son alias Language. C'est également la valeur par défaut pour les classes dérivant de FrameworkContentElement. De telles classes comprennent System.Windows.Documents.Paragraph, System.Windows.Documents.Table, System.Windows.Documents.TableCell, etc.
User : la culture pour les nombres est la culture du thread actuel. Cette propriété est la valeur par défaut pour toutes les sous-classes de FrameworkElement telles que Page, Window et TextBlock.
CultureOverride :
La propriété CultureOverride est utilisée uniquement si la propriété CultureSource a la valeur Override et est ignorée dans le cas contraire. Elle spécifie la culture pour les nombres. La valeur null, la valeur par défaut, est interprétée comme en-US.
Substitution :
Cette propriété spécifie le type de substitution de nombres à effectuer. Elle prend une des valeurs d'énumération NumberSubstitutionMethod suivantes.
AsCulture : la méthode de substitution est déterminée en fonction de la propriété NumberFormatInfo.DigitSubstitution de la culture pour les nombres. Il s'agit de la valeur par défaut.
Context : si la culture pour les nombres est l'arabe ou le farsi, il spécifie que les chiffres dépendent du contexte.
European : les nombres sont toujours restitués comme des chiffres européens.
NativeNational : les nombres sont restitués en utilisant les chiffres nationaux de la culture pour les nombres, comme spécifié par la propriété NumberFormatInfo de la culture.
Traditional : les nombres sont restitués en utilisant les chiffres traditionnels de la culture pour les nombres. Pour la plupart des cultures, cette valeur est identique à NativeNational. Toutefois, l'utilisation de NativeNational produit des chiffres latins pour certaines cultures arabes, tandis que Traditional produit des chiffres arabes pour toutes les cultures arabes.
Que signifient ces valeurs pour un développeur de contenu bidirectionnel ? Dans la plupart des cas, le développeur peut uniquement avoir besoin de définir FlowDirection et la langue de chaque élément textuel de l'interface utilisateur, par exemple Language="ar-SA", et la logique de NumberSubstitution se charge d'afficher les nombres en fonction de la bonne interface utilisateur. L'exemple suivant illustre l'utilisation des nombres arabes et anglais dans une application Windows Presentation Foundation (WPF) s'exécutant sur une version arabe de 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>
Le graphique suivant montre la sortie produite par l'exemple précédent lors de son exécution sur une version arabe de Windows.
Graphique montrant l'affichage de nombres arabes et anglais
Pour obtenir un exemple complet, consultez Nombres, exemple.
FlowDirection était important dans le cas présent parce qu'affecter à FlowDirection la valeur LeftToRight à la place aurait produit des chiffres européens. Les sections suivantes expliquent comment obtenir un affichage unifié des chiffres dans l'ensemble de votre document. Si cet exemple ne s'exécute pas sur une version arabe de Windows, tous les chiffres sont affichés en tant que chiffres européens.
Définition des règles de substitution
Dans une application réelle il est possible que vous ayez besoin de définir la langue par programme. Par exemple, vous souhaitez affecter à l'attribut Language (xml:lang) le même que celui utilisé par l'interface utilisateur du système, ou peut-être modifier Language en fonction de l'état de l'application.
Si vous souhaitez effectuer des modifications en fonction de l'état de l'application, utilisez d'autres fonctionnalités fournies par Windows Presentation Foundation (WPF).
En premier lieu, définissez NumberSubstitution.CultureSource=“Text” pour le composant de l'application. L'utilisation de ce paramètre permet de s'assurer que les paramètres ne proviennent pas de l'interface utilisateur pour les éléments de texte qui ont "User" comme valeur par défaut, tel que TextBlock.
Par exemple :
<TextBlock Name="text1" NumberSubstitution.CultureSource="Text"> 1234+5679=6913 </TextBlock> |
Dans le code C# correspondant, affectez par exemple "ar-SA" à la propriété Language.
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage("ar-SA"); |
Si vous avez besoin d'affecter la langue de l'interface utilisateur de l'utilisateur actuel à la propriété Language, utilisez le code suivant.
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage( System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag); |
CurrentCulture représente la culture actuelle utilisée par le thread actuel au moment de l'exécution.
Votre exemple final en XAML doit être semblable à l'exemple suivant.
<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>
Pour obtenir un exemple complet, consultez Numbers2, exemple.
Votre exemple final en C# doit être semblable à ce qui suit.
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;
}
}
}
}
Pour l'exemple complet, consultez NumbersCSharp, exemple.
Le graphique suivant montre à quoi ressemble la fenêtre pour l'un ou l'autre de ces langages de programmation.
Graphique affichant des nombres arabes
Utilisation de la propriété Substitution
La façon dont fonctionne la substitution de nombres dans Windows Presentation Foundation (WPF) dépend à la fois de la langue de l'élément de texte et de son FlowDirection. Si FlowDirection est de gauche à droite, ce sont des chiffres européens qui sont restituées. Cependant, s'il est précédé par du texte arabe, ou que Language a la valeur "ar" et que FlowDirection a la valeur RightToLeft, ce sont les chiffres arabes qui sont restitués à la place.
Toutefois, dans certains cas, il se peut que vous souhaitiez créer une application unifiée, avec par exemple des chiffres européens pour tous les utilisateurs. Ou des chiffres arabes dans des cellules de Table avec un Style spécifique. Pour ce faire, une méthode simple consiste à utiliser la propriété Substitution.
Dans l'exemple suivant, le premier TextBlock n'a pas sa propriété Substitution définie, l'algorithme affiche donc les chiffres arabes comme prévu. Cependant, dans le deuxième TextBlock, la substitution a la valeur European qui remplace la substitution par défaut pour les nombres arabes, et ce sont des chiffres européens qui sont affichés.
<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>
Pour obtenir un exemple complet, consultez Numbers3, exemple.