Übersicht über bidirektionale Features in WPF
Im Gegensatz zu anderen Entwicklungsplattformen verfügt WPF über zahlreiche Features, die die schnelle Entwicklung bidirektionaler Inhalte unterstützen – beispielsweise sowohl Daten mit Flussrichtung von links nach rechts als auch Daten mit Flussrichtung von rechts nach links im gleichen Dokument. Gleichzeitig bietet WPF eine hervorragende Erfahrung für Benutzer, die bidirektionale Features benötigen. Hierzu zählen beispielsweise Arabisch oder Hebräisch sprechende Benutzer.
In den folgenden Abschnitten werden bidirektionale Funktionen sowie Beispiele erklärt, die zeigen, wie die beste Anzeige von bidirektionalem Inhalts erreicht werden kann. In den meisten Beispielen wird XAML verwendet. Die Konzepte sind jedoch problemlos auf C#- oder Microsoft Visual Basic-Code übertragbar.
FlowDirection
Die grundlegende Eigenschaft, die die Flussrichtung des Inhalts in einer WPF-Anwendung festlegt, ist FlowDirection. Diese Eigenschaft kann auf einen von zwei Enumerationswerten festgelegt werden: LeftToRight oder RightToLeft. Die Eigenschaft ist für alle WPF-Elemente verfügbar, die von FrameworkElement erben.
In den folgenden Beispielen wird die Flussrichtung eines Elements vom Typ TextBox festgelegt:
Flussrichtung von links nach rechts
<TextBlock Background="DarkBlue" Foreground="LightBlue"
FontSize="20" FlowDirection="LeftToRight">
This is a left-to-right TextBlock
</TextBlock>
Flussrichtung von rechts nach links
<TextBlock Background="LightBlue" Foreground="DarkBlue"
FontSize="20" FlowDirection="RightToLeft">
This is a right-to-left TextBlock
</TextBlock>
Die folgende Grafik zeigt, wie der vorherige Code gerendert wird.
Ein Element in einer Benutzeroberflächenstruktur erbt die Flussrichtung (FlowDirection) von seinem Container. Im folgenden Beispiel befindet sich der Textblock (TextBlock) innerhalb eines Rasters (Grid), das sich wiederum in einem Fenster (Window) befindet. Wenn die Flussrichtung (FlowDirection) für das Fenster (Window) festgelegt wird, wird sie implizit auch für das Raster (Grid) und den Textblock (TextBlock) festgelegt.
Das Festlegen der Flussrichtung (FlowDirection) wird im folgenden Beispiel veranschaulicht:
<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>
Das Fenster (Window) der obersten Ebene hat eine Flussrichtung von rechts nach links (RightToLeftFlowDirection), und alle darin enthaltenen Elemente erben die gleiche Flussrichtung (FlowDirection). Wenn ein Element die angegebene Flussrichtung (FlowDirection) überschreiben soll, muss ein expliziter Richtungswechsel hinzugefügt werden. Dies ist im vorherigen Beispiel beim zweiten Textblock (TextBlock) der Fall: Hier wechselt die Flussrichtung zu links nach rechts (LeftToRight). Wird keine Flussrichtung (FlowDirection) definiert, gilt die Standardeinstellung LeftToRight.
Die folgende Grafik zeigt die Ausgabe des vorherigen Beispiels:
FlowDocument
Viele Entwicklungsplattformen wie etwa HTML, Win32 und Java bieten besondere Unterstützung für die Entwicklung bidirektionaler Inhalte. Markupsprachen wie HTML bieten Inhaltserstellern die notwendigen Markups, um Text in jeder beliebigen Richtung anzuzeigen. Beispiele wären etwa das HTML 4.0-Tag „dir“, das „rtl“ (right-to-left, von rechts nach links) oder „ltr“ (left-to-right, von links nach rechts) als Werte akzeptiert. Dieses Tag ist mit der Eigenschaft FlowDirection vergleichbar, die Eigenschaft FlowDirection bietet jedoch mehr Möglichkeiten für das Layout von Textinhalten und kann auch für textfremde Inhalte verwendet werden.
Hierbei handelt es sich um ein UI-Element, das eine Kombination aus Text, Tabellen, Bildern und anderen Elementen hosten kann. Die Beispiele in den folgenden Abschnitten verwenden dieses Element.
Es gibt mehrere Möglichkeiten, einem Flussdokument (FlowDocument) Text hinzuzufügen. Eine einfache Möglichkeit ist die Verwendung eines Absatzes (Paragraph). Hierbei handelt es sich um ein Block-Level-Element zum Gruppieren von Inhalten (beispielsweise Text). In den Beispielen werden Span und Run verwendet, um Text zu Elementen auf Inlineebene hinzuzufügen. Span ist ein Element für den Inhaltsfluss auf Inlineebene, das zum Gruppieren anderer Inlineelemente verwendet wird. Run ist ein Element für den Inhaltsfluss auf Inlineebene, das für unformatierten Text vorgesehen ist. Ein Span-Element kann mehrere Run-Elemente enthalten.
Das erste Dokumentbeispiel enthält ein Dokument mit einer Reihe von Netzwerkfreigabenamen (beispielsweise \\server1\folder\file.ext
). Egal, ob Sie diesen Netzwerklink in einem arabischen oder einem englischen Dokument haben, Sie möchten, dass es immer auf die gleiche Weise angezeigt wird. Die folgende Grafik veranschaulicht die Verwendung des Span-Elements und zeigt den Link in einem arabischen Dokument mit Flussrichtung von rechts nach links (RightToLeft):
Alle Sonderzeichen (beispielsweise „\“) trennen den Text von rechts nach links, da die Textrichtung RightToLeft ist. Das führt dazu, dass der Link nicht in der richtigen Reihenfolge angezeigt wird. Zur Lösung dieses Problems muss der Text eingebettet werden, um ein separates Run-Element mit Flussrichtung von links nach rechts (LeftToRight) zu erhalten. Anstatt für jede Sprache ein separates Run-Element festzulegen, ist es besser, den seltener verwendeten englischen Text in ein größeres arabisches Span-Element einzubetten.
Die folgende Grafik veranschaulicht dies anhand eines Span-Elements mit eingebettetem Run-Element:
Im folgenden Beispiel wird die Verwendung von Run- und Span-Elementen in Dokumenten veranschaulicht.
<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-Elemente
Das Span-Element fungiert als Trennzeichengrenze zwischen Text mit unterschiedlichen Flussrichtungen. Sogar Span-Elemente mit der gleichen Flussrichtung werden als Elemente mit unterschiedlichen bidirektionalen Bereichen betrachtet. Das bedeutet, dass die Span-Elemente in der Reihenfolge der Flussrichtung (FlowDirection) des Containers angeordnet werden. Nur der Inhalt innerhalb des Span-Elements folgt der Flussrichtung (FlowDirection) des Span-Elements.
Die folgende Abbildung zeigt die Flussrichtung mehrerer TextBlock-Elemente:
Das folgende Beispiel zeigt, wie Sie die Span- und Run-Elemente verwenden, um die in der vorherigen Abbildung gezeigten Ergebnisse zu erzielen.
<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>
In den TextBlock-Elementen des Beispiels werden die Span-Elemente gemäß der Flussrichtung (FlowDirection) ihres jeweils übergeordneten Elements angeordnet. Die Flussrichtung des Texts innerhalb der einzelnen Span-Elemente richtet sich jedoch jeweils nach der zugehörigen Flussrichtung (FlowDirection). Dies gilt für Latein und Arabisch - oder jede andere Sprache.
Hinzufügen von xml:lang
Die folgende Grafik zeigt ein anderes Beispiel, das Zahlen und arithmetische Ausdrücke wie etwa "200.0+21.4=221.4"
verwendet. Beachten Sie, dass nur die Flussrichtung (FlowDirection) festgelegt wird.
Benutzer dieser Anwendung werden von der Ausgabe enttäuscht sein. Die Flussrichtung (FlowDirection) ist zwar korrekt, die Zahlen sehen jedoch nicht wie arabische Zahlen aus.
XAML-Elemente können ein XML-Attribut (xml:lang
) enthalten, das die Sprache jedes Elements definiert. XAML unterstützt auch ein XML-Sprachprinzip, das dafür sorgt, dass Werte vom Typ xml:lang
, die auf übergeordnete Elemente in der Struktur angewendet werden, von untergeordneten Elementen verwendet werden. Im vorherigen Beispiel wurde für xml:lang
der Standardwert (bei XAML: en-US
) verwendet, da für das Run-Element oder für eines der übergeordneten Elemente keine Sprache definiert wurde. Der interne Algorithmus für die Zahlengestaltung von Windows Presentation Foundation (WPF) wählt Zahlen in der entsprechenden Sprache aus (in diesem Fall: Englisch). Um die arabischen Zahlen korrekt zu rendern, muss xml:lang
festgelegt werden.
Die folgende Grafik zeigt das Beispiel nach dem Hinzufügen von xml:lang
:
Im folgenden Beispiel wird der Anwendung xml:lang
hinzugefügt.
<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>
Beachten Sie, dass viele Sprachen unterschiedliche xml:lang
-Werte haben, die von der gewünschten Region abhängen. So stellen beispielsweise "ar-SA"
und "ar-EG"
zwei Varianten der arabischen Sprache dar. Die vorherigen Beispiele zeigen, dass Sie sowohl den xml:lang
-Wert als auch den FlowDirection-Wert definieren müssen.
FlowDirection mit Nicht-Text-Elementen
FlowDirection definiert nicht nur die Flussrichtung von Text in einem Textelement, sondern auch die Flussrichtung nahezu aller anderen UI-Elemente. Die folgende Grafik zeigt eine Symbolleiste (ToolBar), für die ein horizontaler linearer Farbverlaufspinsel (LinearGradientBrush) verwendet wird, um den Hintergrund mit einem Farbverlauf von links nach rechts zu zeichnen.
Nach dem Festlegen der Flussrichtung (FlowDirection) auf rechts nach links (RightToLeft) werden nicht nur die Schaltflächen auf der Symbolleiste (ToolBar) von rechts nach links angeordnet. Auch die Offsets des linearen Farbverlaufspinsels (LinearGradientBrush) werden von rechts nach links ausgerichtet.
Die folgende Grafik zeigt die Neuausrichtung des linearen Farbverlaufspinsels (LinearGradientBrush):
Im folgenden Beispiel wird eine Leiste von rechts nach links (RightToLeftToolBar) gezeichnet. Wenn sie von links nach rechts gezeichnet werden soll, muss das Attribut FlowDirection für die Symbolleiste (ToolBar) entfernt werden.
<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>
FlowDirection-Ausnahmen
Es gibt einige Fälle, in denen sich die Flussrichtung (FlowDirection) nicht wie erwartet verhält. In diesem Abschnitt werden zwei von diesen Ausnahmen behandelt.
Image
Ein Image-Element stellt ein Steuerelement zum Anzeigen eines Bilds dar. In XAML kann es mit einer Eigenschaft vom Typ Source verwendet werden, die den URI (Uniform Resource Identifier) des anzuzeigenden Bilds (Image) definiert.
Im Gegensatz zu anderen UI-Elementen erbt ein Bild (Image) nicht die Flussrichtung (FlowDirection) des Containers. Wenn jedoch die Flussrichtung (FlowDirection) explizit auf von rechts nach links (RightToLeft) festgelegt ist, wird ein Bild (Image) horizontal gespiegelt angezeigt. Dies wird als eine praktische Funktion für Entwickler von bidirektionalem Inhalt implementiert, da in einigen Fällen das horizontale Spiegeln des Bildes den gewünschten Effekt erzeugt.
Die folgende Grafik zeigt ein gespiegeltes Bild (Image):
Das folgende Beispiel zeigt, dass das Bild (Image) nicht die Flussrichtung (FlowDirection) des StackPanel-Elements erbt, in dem es sich befindet.
Hinweis
Für dieses Beispiel wird eine Datei namens ms_logo.jpg auf dem Laufwerk C:\ benötigt.
<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>
Hinweis
In den Downloaddateien ist eine Datei namens ms_logo.jpg enthalten. Der Code geht davon aus, dass die JPG-Datei sich nicht in Ihrem Projekt, sondern an einer beliebigen Stelle auf dem Laufwerk C:\ befindet. Sie kopieren das .jpg aus den Projektdateien auf Ihr Laufwerk C:\ oder ändern den Code, um die Datei im Projekt zu suchen. Ändern Sie hierzu Source="file://c:/ms_logo.jpg"
in Source="ms_logo.jpg"
.
Paths
Neben einem Bild (Image) ist ein Pfad (Path) ein weiteres interessantes Element. Ein Pfad ist ein Objekt, das eine Reihe von miteinander verbundenen Linien und Kurven zeichnen kann. Es verhält sich hinsichtlich der Flussrichtung (FlowDirection) ähnlich wie ein Bild (Image). So handelt es sich beispielsweise bei seiner Flussrichtung von rechts nach links (RightToLeftFlowDirection) um eine horizontale Spiegelung seiner Flussrichtung von links nach rechts (LeftToRight). Anders als bei einem Bild (Image) erbt der Pfad (Path) seine Flussrichtung (FlowDirection) allerdings vom Container, sodass sie nicht explizit angegeben werden muss.
Im folgenden Beispiel wird ein einfacher Pfeil mit drei Linien gezeichnet. Der erste Pfeil erbt die Flussrichtung von rechts nach links (RightToLeft) vom StackPanel-Element, sodass sein Start- und Endpunkt von einem Stammelement auf der rechten Seite gemessen werden. Der zweite Pfeil verfügt über eine explizite Flussrichtung von rechts nach links (RightToLeftFlowDirection) und beginnt ebenfalls auf der rechten Seite. Der dritte Pfeil hat jedoch seinen Startstamm auf der linken Seite. Weitere Informationen zum Zeichnen finden Sie unter LineGeometry sowie unter 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>
Die folgende Grafik zeigt die Ausgabe des vorherigen Beispiels mit Pfeilen, die mit dem Path
-Element gezeichnet werden:
Image sind Path zwei Beispiele dafür, wie WPF FlowDirection verwendet. Neben der Anordnung von UI-Elementen in einer bestimmten Richtung innerhalb eines Containers kann FlowDirection mit Elementen wie InkPresenter verwendet werden, die Freihandeingaben auf einer Oberfläche rendern (LinearGradientBrush, RadialGradientBrush). Wenn Sie für Ihren Inhalt eine Flussrichtung von rechts nach links benötigen, die eine Flussrichtung von links nach rechts imitiert (oder umgekehrt), bietet Windows Presentation Foundation (WPF) diese Möglichkeit.
Ersetzen von Zahlen
In der Vergangenheit hat Windows das Ersetzen von Zahlen unterstützt, indem die Darstellung der verschiedenen kulturellen Formen für die gleichen Ziffern zugelassen wurde, während der interne Speicher dieser Ziffern unter unterschiedlichen Gebietsschemas einheitlich blieb. So wurden Zahlen beispielsweise in ihren bekannten Hexadezimalwerten (0x40, 0x41) gespeichert, aber entsprechend der ausgewählten Sprache angezeigt.
Dadurch wurde es Anwendungen ermöglicht, numerische Werte zu verarbeiten, ohne dass sie von einer Sprache in eine andere konvertiert werden mussten. So kann beispielsweise ein Benutzer ein Microsoft Excel-Arbeitsblatt in einer lokalisierten arabischen Windows-Version öffnen und die Zahlen in der arabischen Darstellung sehen, während die gleichen Zahlen in einer europäischen Version von Windows in der europäischen Darstellung angezeigt werden. Dies ist auch für andere Symbole, wie z.B. Kommas als Trennzeichen und das Prozentsatzsymbol notwendig, da sie normalerweise Zahlen in einem Dokument begleiten.
Windows Presentation Foundation (WPF) führt diese Tradition fort und erweitert die Unterstützung dieses Features, um Benutzern mehr Steuerungsmöglichkeiten im Zusammenhang mit der Ersetzung zu bieten. Diese Funktion ist für jede Sprache konzipiert, da sie besonders für bidirektionalen Inhalt nützlich ist, bei dem die Strukturierung von Ziffern für eine bestimmte Sprache in der Regel eine Herausforderung für die Entwickler der Anwendung darstellt, da eine Anwendung aufgrund der verschiedenen Kulturen möglicherweise weiter ausgeführt wird.
Die Kerneigenschaft zum Steuern der Ersetzung in Windows Presentation Foundation (WPF) ist die Substitution-Abhängigkeitseigenschaft. Die Klasse NumberSubstitution gibt an, wie Zahlen im Text angezeigt werden. Er verfügt über drei öffentliche Eigenschaften, die sein Verhalten definieren. Im Anschluss finden Sie eine Zusammenfassung der einzelnen Eigenschaften:
CultureSource:
Diese Eigenschaft gibt an, wie die Kultur für Zahlen bestimmt wird. Sie akzeptiert einen von drei NumberCultureSource-Enumerationswerten.
Außerkraftsetzung: Die Kultur für Zahlen ist die Kultur der Eigenschaft CultureOverride.
Text: Die Kultur der Zahl, ist die Kultur der Textausführung. In Markup wäre das
xml:lang
oder die zugehörige AliaseigenschaftLanguage
(Language oder Language). Außerdem ist dies der Standard für abgeleitete Klassen von FrameworkContentElement. Zu diesen Klassen zählen unter anderem System.Windows.Documents.Paragraph, System.Windows.Documents.Table und System.Windows.Documents.TableCell.Benutzer: Die Kultur der Zahl, ist die Kultur des aktuellen Threads. Diese Eigenschaft ist die Standardeinstellung für alle Unterklassen von FrameworkElement (beispielsweise Page, Window und TextBlock).
CultureOverride:
Die Eigenschaft CultureOverride wird nur verwendet, wenn die Eigenschaft CultureSource auf Override festgelegt ist. Andernfalls wird sie ignoriert. Es gibt die Kultur der Zahl an. Der Standardwert null
wird als „en-US“ interpretiert.
Ersetzung:
Diese Eigenschaft gibt den Typ der zu ersetzenden Zahl an. Sie kann einen der folgenden NumberSubstitutionMethod-Enumerationswerte haben:
AsCulture: Die Ersetzungsmethode wird anhand der Eigenschaft NumberFormatInfo.DigitSubstitution der Zahlenkultur bestimmt. Dies ist die Standardeinstellung.
Context: Gibt an, dass die Ziffern vom Kontext abhängen, wenn die Zahlenkultur Arabisch oder Persisch ist.
European: Zahlen werden immer als europäische Ziffern gerendert.
NativeNational: Gibt an, dass Zahlen mit den nationalen Ziffern für die Zahlenkultur gerendert werden, die durch das Zahlenformat (NumberFormat) der Kultur angegeben werden.
Traditional: Zahlen werden mit den herkömmlichen Ziffern für die Kultur gerendert. Bei den meisten Kulturen entspricht dies NativeNational. NativeNational führt jedoch zu lateinischen Ziffern für einige arabische Kulturen, während dieser Wert für alle arabischen Kulturen zu arabischen Ziffern führt.
Was bedeuten diese Werte für einen Entwickler von bidirektionalem Inhalt? In den meisten Fällen muss der Entwickler möglicherweise nur FlowDirection und die Sprache der einzelnen Textelemente definieren (beispielsweise Language="ar-SA"
). Die Anzeige der Zahlen gemäß der korrekten Benutzeroberfläche wird dann über die NumberSubstitution-Logik erreicht. Im folgenden Beispiel wird die Verwendung arabischer und englischer Zahlen in einer WPF-Anwendung (Windows Presentation Foundation) in einer arabischen Version von Windows veranschaulicht.
<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>
Die folgende Abbildung zeigt die Ausgabe des vorherigen Beispiels bei Verwendung einer arabischen Version von Windows mit arabischen und englischen Zahlen:
Die Flussrichtung (FlowDirection) war in diesem Fall wichtig, da das Festlegen der Flussrichtung (FlowDirection) auf LeftToRight zu europäischen Ziffern geführt hätte. In den folgenden Abschnitten wird erläutert, wie eine einheitliche Anzeige von Ziffern im gesamten Dokument möglich ist. Wenn dieses Beispiel in einem arabischen Windows nicht ausgeführt wird, werden alle Ziffern als europäische Ziffern angezeigt.
Definieren von Ersetzungsregeln
In einer realen Anwendung müssen Sie die Sprache programmgesteuert festlegen. Sie können beispielsweise das Attribut xml:lang
so festlegen, dass es dem Attribut der Benutzeroberfläche des Systems entspricht, oder die Sprache je nach Anwendungszustand ändern.
Wenn Sie Änderungen auf der Grundlage des Anwendungszustands vornehmen möchten, nutzen Sie andere Features von Windows Presentation Foundation (WPF).
Legen Sie zunächst NumberSubstitution.CultureSource="Text"
für die Anwendungskomponente fest. Mit dieser Einstellung wird sichergestellt, dass die Einstellungen nicht von der Benutzeroberfläche für Textelemente stammen, die „User“ (Benutzer) als Standardwert haben (beispielsweise TextBlock).
Beispiel:
<TextBlock
Name="text1" NumberSubstitution.CultureSource="Text">
1234+5679=6913
</TextBlock>
Legen Sie im entsprechenden C#-Code die Eigenschaft Language
fest (etwa auf "ar-SA"
).
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage("ar-SA");
Wenn Sie die Eigenschaft Language
der aktuellen Benutzeroberflächensprache des Benutzers festlegen müssen, verwenden Sie den folgenden Code.
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);
CultureInfo.CurrentCulture stellt die aktuelle Kultur dar, die zur Laufzeit vom aktuellen Thread verwendet wird.
Das fertige XAML-Beispiel sollte in etwa wie das folgende Beispiel aussehen:
<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>
Das fertige C#-Beispiel sollte in etwa wie folgt aussehen:
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;
}
}
}
}
Die folgende Grafik zeigt, wie das Fenster für beide Programmiersprachen aussieht, wenn arabische Zahlen angezeigt werden:
Mithilfe der Ersetzungseigenschaft
Die Funktionsweise der Ersetzung von Zahlen in Windows Presentation Foundation (WPF) hängt sowohl von der Sprache des Textelements als auch von der Flussrichtung (FlowDirection) ab. Bei einer Flussrichtung (FlowDirection) von links nach rechts werden europäische Ziffern gerendert. Wenn allerdings ein arabischer Text vorangestellt ist oder aber die Sprache auf „ar“ und die Flussrichtung (FlowDirection) auf von rechts nach links (RightToLeft) festgelegt ist, werden stattdessen arabische Ziffern gerendert.
In einigen Fällen möchten Sie jedoch eine einheitliche Anwendung, zum Beispiel mit europäischen Ziffern für alle Benutzer erstellen. Oder arabische Ziffern in den Zellen einer Tabelle (Table) mit einem bestimmten Stil (Style). Eine einfache Möglichkeit hierfür ist die Verwendung der Eigenschaft Substitution.
Im folgenden Beispiel ist die Eigenschaft Substitution für den ersten Textblock (TextBlock) nicht festgelegt, sodass erwartungsgemäß arabische Ziffern angezeigt werden. Im zweiten Textblock (TextBlock) ist die Ersetzung dagegen auf europäisch festgelegt. Dadurch wird die Standardersetzung für arabische Zahlen überschrieben, und es werden europäische Ziffern angezeigt.
<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>
.NET Desktop feedback