Übersicht über bidirektionale Features in WPF

Aktualisiert: November 2007

Im Gegensatz zu anderen Entwicklungsplattformen bietet WPF viele Features, die die schnelle Entwicklung von bidirektionalem Inhalt unterstützen, beispielsweise Daten, die in einem Dokument von links nach rechts und von rechts nach links dargestellt werden. WPF ist auf Benutzer zugeschnitten, die bidirektionale Features benötigen, z. B. Benutzer, die Arabisch oder Hebräisch sprechen.

In den folgenden Abschnitten werden bidirektionale Features beschrieben und Beispiele bereitgestellt, die veranschaulichen, wie die beste Anzeige von bidirektionalem Inhalts erzielt wird. Bei den meisten Beispielen wird XAML verwendet, aber Sie können die Konzepte problemlos in C#-Code oder Microsoft Visual Basic-Code anwenden.

Dieses Thema enthält folgende Abschnitte.

  • FlowDirection
  • FlowDocument
  • Span-Elemente
  • FlowDirection mit Elementen, die kein Text sind
  • Ersetzen von Zahlen

FlowDirection

Die grundlegende Eigenschaft, die die Flussrichtung des Inhalts in einer WPF-Anwendung definiert, ist FlowDirection. Diese Eigenschaft kann auf einen von zwei Enumerationswerten, LeftToRight oder RightToLeft, festgelegt werden. Die Eigenschaft steht allen WPF-Elementen zur Verfügung, die vom FrameworkElement erben.

Tipp

Alle Grafiken in diesem Thema zeigen den Code und wie er im XAMLPad-Tool gerendert wird. In den meisten Fällen wird auch ein Beispiel bereitgestellt, das Sie herunterladen können.

In den folgenden Beispielen wird die Flussrichtung eines TextBox-Elements 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>

Ein vollständiges Beispiel finden Sie unter Beispiel zu LeftToRight und RightToLeft.

Die folgende Grafik zeigt, wie der Code oben gerendert wird.

Grafik, die die FlowDirection veranschaulicht

TextBlock-Ausrichtung

Ein Element innerhalb einer Benutzeroberfläche (user interface, UI)-Struktur erbt die FlowDirection von seinem Container. Im folgenden Beispiel befindet sich der TextBlock in einem Grid, das sich in einem Window befindet. Wenn Sie die FlowDirection für das Window festlegen, wird sie auch für das Grid und den TextBlock festgelegt.

Im folgenden Beispiel wird gezeigt, wie die FlowDirection festgelegt wird.

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

Für das Window auf der obersten Ebene ist die FlowDirection auf RightToLeft festgelegt, sodass alle darin enthaltenen Elemente ebenfalls die gleiche FlowDirection erben. Wenn für ein Element eine angegebene FlowDirection überschrieben werden soll, muss ein expliziter Richtungswechsel hinzugefügt werden, wie z. B. der zweite TextBlock im vorherigen Beispiel, in dem zu LeftToRight gewechselt wird. Wenn keine FlowDirection definiert ist, wird standardmäßig LeftToRight angewendet.

Ein vollständiges Beispiel finden Sie unter Beispiel für FlowDirection.

Die folgende Grafik zeigt die Ausgabe des vorherigen Beispiels.

Grafik, die die explizit zugewiesene FlowDirection veranschaulicht

Darstellung der Flussrichtung

FlowDocument

Viele Entwicklungsplattformen, z. B. HTML, Win32 und Java™, bieten besondere Unterstützung für die Entwicklung von bidirektionalem Inhalt. Markupsprachen, wie HTML, bieten das notwendig Markup für den Verfasser des Inhalts, um den Text in jeder beliebigen Richtung anzuzeigen, beispielsweise den Tag "dir" in HTML 4.0, der "rtl" oder "ltr" als Werte akzeptiert. Dieser Tag ähnelt der FlowDirection-Eigenschaft, aber die FlowDirection-Eigenschaft bietet erweiterte Möglichkeiten für das Layout von Textinhalt und kann für Inhalte verwendet werden, die kein Text sind.

FlowDocument in WPF ist ein vielseitiges Benutzeroberfläche-Element, das eine Kombination aus Text, Tabellen, Bildern und anderen Elementen hosten kann. Dieses Element wird in den Beispielen in den folgenden Abschnitten verwendet.

Es gibt mehrere Methoden für das Hinzufügen von Text zu einem FlowDocument. Eine einfache Methode besteht darin, einen Paragraph zu verwenden. Es handelt sich dabei um ein Element auf Blockebene, mit dem Inhalt (beispielsweise Text) gruppiert werden kann. In den Beispielen werden Span und Run verwendet, um Text zu Elementen auf Inlineebene hinzuzufügen. Span ist ein fortlaufendes Inhaltselement auf Inlineebene, das zum Gruppieren anderer Inlineelemente verwendet wird, während es sich bei Run um ein fortlaufendes Inhaltselement auf Inlineebene handelt, das unformatierten Text enthalten kann. Ein Span-Element kann mehrere Run-Elemente enthalten.

Das erste Dokumentbeispiel enthält ein Dokument, in dem eine Reihe von Netzwerkfreigabenamen enthalten sind, beispielsweise \\server1\folder\file.ext. Dieser Netzwerklink soll immer gleich angezeigt werden, unabhängig davon, ob er in einem arabischen oder einem englischen Dokument enthalten ist. Die folgende Grafik zeigt den Link in einem arabischen RightToLeft-Dokument.

Grafik, die veranschaulicht, wie das Span-Element verwendet wird

Dokument, das von rechts nach links fließt

Da der Text RightToLeft ist, trennen alle Sonderzeichen, wie das Zeichen "\", den Text in der Reihenfolge von rechts nach links. Dies führt dazu, dass der Link nicht in der richtigen Reihenfolge angezeigt wird. Zum Beheben des Problems muss der Text eingebettet werden, um ein separates Run-Element mit der Richtung LeftToRight beizubehalten. Statt für jede Sprache ein separates Run-Element einzufügen, sollte der weniger häufig verwendete englische Text in ein größeres arabisches Span-Element eingebettet werden.

Dies wird in der folgenden Grafik veranschaulicht.

Grafik, die veranschaulicht, wie das in einem Span-Element eingebettete Run-Element verwendet wird

XamlPad-Bildschirmabbildung

Im folgenden Beispiel wird veranschaulicht, wie das Run-Element und das Span-Element in Dokumenten verwendet wird.

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

Ein vollständiges Beispiel finden Sie unter Beispiel zu RunSpan.

Span-Elemente

Das Span-Element funktioniert als ein Begrenzungstrennzeichen zwischen Textabschnitten mit verschiedenen Flussrichtungen. Selbst Span-Elemente mit der gleichen Flussrichtung werden als Elemente mit verschiedenen bidirektionalen Bereichen betrachtet. Das bedeutet, dass die Span-Elemente in der FlowDirection des Containers angeordnet werden. Lediglich der Inhalt im Span-Element hat die FlowDirection des Span-Elements.

Die folgende Grafik zeigt die Flussrichtung von mehreren TextBlock-Elementen.

Grafik, die die FlowDirection in mehreren TextBlock-Elementen veranschaulicht

Textblöcke mit unterschiedlichen Flussrichtungen

Im folgenden Beispiel wird veranschaulicht, wie Sie das Span-Element und das Run-Element verwenden, um das in der vorherigen Grafik angezeigte Resultat zu erzielen.

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

Ein vollständiges Codebeispiel finden Sie unter Beispiel für Span.

In den TextBlock-Elementen im Beispiel werden die Span-Elemente gemäß der FlowDirection ihrer übergeordneten Elemente angeordnet. Der Text innerhalb jedes Span-Elements fließt jedoch gemäß seiner eigenen FlowDirection. Dies gilt für alle Sprachen, sei es Latein oder Arabisch.

Hinzufügen von xml:lang

Die folgende Grafik zeigt ein anderes Beispiel, in dem Zahlen und arithmetische Ausdrücke verwendet werden, z. B. "200.0+21.4=221.4." Beachten Sie, dass nur die FlowDirection festgelegt ist.

Grafik, in der beim Anzeigen von Zahlen nur die FlowDirection verwendet wird

Zahlen, die von rechts nach links fließen

Benutzer dieser Anwendung werden von der Ausgabe enttäuscht sein, denn obwohl die FlowDirection korrekt ist, entspricht die Form der Zahlen nicht der Form, die für arabische Zahlen erwartet wird.

XAML-Elemente erben eine XML-Eigenschaft, die xml:lang-Behandlung in XAML (Language ist der Alias) genannt wird und die Sprache jedes Elements definiert. Da im vorherigen Beispiel weder für das Run-Element noch für die übergeordneten Elemente der obersten Ebene eine Sprache definiert wurde, wird die Standardsprache verwendet, die hier en-US ist. Der interne Windows Presentation Foundation (WPF)-Algorithmus für die Zahlendarstellung wählt Zahlen in der entsprechenden Sprache aus - in diesem Fall Englisch. Um die arabischen Zahlen korrekt zu rendern, muss xml:lang-Behandlung in XAML (Language) festgelegt werden.

Die folgende Grafik zeigt das Beispiel, nachdem eine Language-Eigenschaft hinzugefügt wurde.

Grafik, die veranschaulicht, wie das xml:lang-Attribut verwendet wird

Arabische Zahlen, die von rechts nach links fließen

Im folgenden Beispiel wird der Anwendung xml:lang-Behandlung in XAML (Language) hinzugefügt.

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

Ein vollständiges Beispiel finden Sie unter Beispiel zu LanguageAttribute.

Beachten Sie, dass es für viele Sprachen unterschiedliche Language-Werte gibt, die von der gewünschten Region abhängen. "ar-SA" und "ar-EG" stellen zum Beispiel zwei Variationen des Arabischen dar. In den vorherigen Beispielen wird veranschaulicht, dass Sie sowohl die Language (xml:lang)-Eigenschaft als auch die FlowDirection-Eigenschaft definieren müssen.

FlowDirection mit Elementen, die kein Text sind

FlowDirection definiert nicht nur die Flussrichtung für Text in einem Textelement, sondern auch für fast alle anderen Benutzeroberfläche-Elemente. Die folgende Grafik zeigt eine ToolBar, die einen horizontalen LinearGradientBrush verwendet, um den Hintergrund zu zeichnen.

Grafik, die eine Symbolleiste mit einem Farbverlauf von links nach rechts zeigt

Bildschirmabbildung für Farbverlauf

Nachdem die FlowDirection auf RightToLeft festgelegt ist, werden nicht nur die ToolBar-Schaltflächen von rechts nach links angeordnet. Selbst der LinearGradientBrush ordnet seine Offsets neu von rechts nach links an.

Die folgende Grafik zeigt die Neuanordnung für den LinearGradientBrush.

Grafik, die eine Symbolleiste mit einem Farbverlauf von rechts nach links zeigt

Ein Farbverlauf, der von rechts nach links fließt

Im folgenden Beispiel wird eine RightToLeft-ToolBar gezeichnet. (Um sie von links nach rechts zu zeichnen, entfernen Sie das FlowDirection-Attribut auf der 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>

Ein vollständiges Beispiel finden Sie unter Beispiel für Farbverlauf.

FlowDirection-Ausnahmen

Es gibt einige Fälle, in denen sich die FlowDirection nicht so verhält, wie erwartet. In diesem Abschnitt werden zwei von diesen Ausnahmen behandelt.

Bild

Ein Image stellt ein Steuerelement dar, das ein Bild anzeigt. In XAML kann es mit einer Source-Eigenschaft verwendet werden, die den Uniform Resource Identifier (URI) für das anzuzeigende Image enthält.

Im Gegensatz zu anderen Benutzeroberfläche-Elementen erbt ein Image die FlowDirection nicht vom Container. Wenn die FlowDirection jedoch explizit auf RightToLeft festgelegt wird, wird ein Image horizontal gekippt angezeigt. Dies wurde als ein praktisches Feature für Entwickler von bidirektionalem Inhalt implementiert, da in manchen Fällen durch das horizontale Kippen des Bilds der gewünschte Effekt erzielt wird.

Die folgende Grafik zeigt ein gekipptes Image.

Grafik, die ein gekipptes Bild veranschaulicht

XamlPad-Bildschirmabbildung

Im folgenden Beispiel wird veranschaulicht, dass das Image nicht die FlowDirection von dem StackPanel erbt, in dem es enthalten ist. Hinweis   Beachten Sie, dass auf Laufwerk C:\ eine Datei mit dem Namen ms_logo.jpg vorhanden sein muss, um dieses Beispiel auszuführen.

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

Ein vollständiges Beispiel finden Sie unter Beispiel für Bilder. Hinweis   Die Downloaddateien enthalten die Datei ms_logo.jpg. Im Code wird davon ausgegangen, dass sich die JPG-Datei nicht im Projekt, sondern an einem Speicherort auf Laufwerk C:\ befindet. Sie müssen die JPG-Datei aus den Projektdateien auf das Laufwerk C:\ kopieren oder den Code so ändern, dass die Datei im Projekt gesucht wird. Ändern Sie hierzu Source="file://c:/ms_logo.jpg" in Source="ms_logo.jpg".

Pfade

Neben einem Image ist ein Path ein weiteres interessantes Element. Ein Path ist ein Objekt, das eine Reihe von verbundenen Linien und Kurven zeichnen kann. Im Hinblick auf die FlowDirection verhält er sich ähnlich wie ein Image; beispielsweise ist seine RightToLeftFlowDirection eine horizontale Spiegelung seiner LeftToRight-Flussrichtung. Im Gegensatz zu einem Image erbt der Path seine FlowDirection jedoch vom Container, sie muss nicht explizit festgelegt werden.

Im folgenden Beispiel wird ein einfacher Pfeil mit 3 Linien gezeichnet. Der erste Pfeil erbt die RightToLeft-Flussrichtung vom StackPanel, sodass seine Anfangs- und Endpunkte von einem Stammelement auf der rechten Seite gemessen werden. Der zweite Pfeil, der eine explizite RightToLeftFlowDirection hat, beginnt ebenfalls auf der rechten Seite. Der dritte Pfeil hat sein Stammelement für den Start auf der linken Seite. Weitere Informationen zum Zeichnen finden Sie unter LineGeometry und unter 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>

Ein vollständiges Beispiel finden Sie unter Beispiel für Pfade.

Die folgende Grafik zeigt die Ausgabe des vorherigen Beispiels.

Grafik, die mit dem Path-Element gezeichnete Pfeile veranschaulicht

Pfade

Image und Path sind zwei Beispiele dafür, wie Windows Presentation Foundation (WPF) die FlowDirection verwendet. Neben der Ausrichtung von Benutzeroberfläche-Elementen in einer bestimmten Richtung innerhalb eines Containers kann die FlowDirection mit Elementen wie InkPresenter (rendert Tinte auf einer Oberfläche), LinearGradientBrush und RadialGradientBrush verwendet werden. Wenn Sie ein Rechts-nach-Links-Verhalten für Inhalt benötigen, das ein Links-nach-Rechts-Verhalten nachahmt, oder umgekehrt, stellt Ihnen Windows Presentation Foundation (WPF) die erforderlichen Funktionen zur Verfügung.

Ersetzen von Zahlen

Windows hat das Ersetzen von Zahlen traditionell dadurch unterstützt, dass die kulturell verschiedenen Formen für die gleichen Ziffern dargestellt werden können, wobei diese Ziffern intern für unterschiedliche Gebietsschemas einheitlich gespeichert werden. Zahlen werden beispielsweise als bekannte Hexadezimalwerte gespeichert (0x40, 0x41), aber je nach gewählter Sprache unterschiedlich angezeigt.

So können Anwendungen numerische Werte verarbeiten, ohne dass sie von einer Sprache in eine andere konvertiert werden müssen. Ein Benutzer kann beispielsweise ein Microsoft Excel-Arbeitsblatt in einer lokalisierten arabischen Version von Windows öffnen und die Zahlen in arabischer Form anzeigen. Er kann auch das gleiche Arbeitsblatt in einer europäischen Version von Windows öffnen und die europäische Darstellung der gleichen Zahlen anzeigen. Dies ist auch für andere Symbole notwendig, z. B. für das Kommatrennzeichen und das Prozentzeichen, da diese Zeichen normalerweise zusammen mit Zahlen in einem Dokument verwendet werden.

Windows Presentation Foundation (WPF) führt diese Tradition fort und fügt zusätzliche Unterstützung für dieses Feature hinzu, mit dem der Benutzer besser steuern kann, wann und wie die Ersetzung verwendet wird. Während dieses Feature für alle Sprachen entworfen wurde, ist es bei bidirektionalem Inhalt besonders nützlich, da eine Darstellung von Zahlen für eine spezifische Sprache aufgrund der verschiedenen Kulturen, in denen eine Anwendung ausgeführt wird, für gewöhnlich eine Herausforderung für Anwendungsentwickler ist.

Die Kerneigenschaft, die steuert, wie die Zahlenersetzung in Windows Presentation Foundation (WPF) funktioniert, ist die Substitution-Abhängigkeitseigenschaft. Die NumberSubstitution-Klasse gibt an, wie Zahlen im Text angezeigt werden. Sie hat drei öffentliche Eigenschaften, die ihr Verhalten definieren. Im Folgenden 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.

CultureOverride:

Die CultureOverride-Eigenschaft wird nur dann verwendet, wenn die CultureSource-Eigenschaft auf Override festgelegt ist. Andernfalls wird sie ignoriert. Sie gibt die Zahlenkultur an. Der Wert null, der Standardwert, wird als en-US interpretiert.

Substitution:

Diese Eigenschaft gibt den Typ der auszuführenden Zahlenersetzung an. Sie akzeptiert einen der folgenden NumberSubstitutionMethod-Enumerationswerte.

  • AsCulture: Die Ersetzungsmethode wird auf Grundlage der NumberFormatInfo.DigitSubstitution-Eigenschaft der Zahlenkultur bestimmt. Dies ist die Standardeinstellung.

  • Context: Gibt an, dass die Ziffern vom Kontext abhängen, wenn die Zahlenkultur Arabisch oder Farsi ist.

  • European: Zahlen werden immer als europäische Ziffern gerendert.

  • NativeNational: Zahlen werden mit den nationalen Ziffern für die Zahlenkultur gerendert, die von der NumberFormatInfo-Eigenschaft der Kultur angegeben werden.

  • Traditional: Zahlen werden mit den traditionellen Ziffern für die Zahlenkultur gerendert. Bei den meisten Kulturen entspricht dies NativeNational. Bei Verwendung von NativeNational können jedoch für einige arabische Kulturen lateinische Ziffern gerendert werden, während mit diesem Wert für alle arabische Kulturen arabische Ziffern gerendert werden.

Was bedeuten diese Werte für einen Entwickler von bidirektionalem Inhalt? In den meisten Fällen muss der Entwickler möglicherweise nur die FlowDirection und die Sprache jedes Benutzeroberfläche-Textelemente definieren, zum Beispiel Language="ar-SA", und die NumberSubstitution-Logik zeigt dann die Zahlen entsprechend der korrekten Benutzeroberfläche an. Im folgenden Beispiel wird veranschaulicht, wie arabische und englische Zahlen in einer Windows Presentation Foundation (WPF)-Anwendung verwendet werden, die in einer arabischen Version von Windows ausgeführt wird.

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

Die folgende Grafik zeigt die Ausgabe des vorherigen Beispiels, wenn Sie eine Anwendung in einer arabischen Version von Windows ausführen.

Grafik mit den angezeigten arabischen und englischen Zahlen

XamlPad-Bildschirmabbildung mit Zahlen

Ein vollständiges Beispiel finden Sie unter Beispiel für Zahlen.

Die FlowDirection war in diesem Fall wichtig, denn wenn die FlowDirection stattdessen auf LeftToRight festgelegt worden wäre, hätte dies europäische Ziffern zur Folge gehabt. In den folgenden Abschnitten wird erläutert, wie Sie eine einheitliche Anzeige von Ziffern im gesamten Dokument erzielen. Wenn dieses Beispiel nicht unter der arabischen Version von Windows ausgeführt wird, werden alle Ziffern als europäische Ziffern angezeigt.

Definieren von Ersetzungsregeln

In einer wirklichen Anwendung müssen Sie die Sprache unter Umständen programmgesteuert festlegen. Angenommen, Sie möchten festlegen, dass das Language-Attribut (xml:lang) mit dem identisch ist, das von der Benutzeroberfläche des Systems verwendet wird, oder Sie möchten die Sprache abhängig vom Anwendungsstatus ändern.

Wenn Sie Änderungen auf der Grundlage des Anwendungsstatus vornehmen möchten, verwenden Sie andere von Windows Presentation Foundation (WPF) bereitgestellte Features.

Legen Sie zunächst die NumberSubstitution.CultureSource=“Text" für die Anwendungskomponente fest. Durch Verwenden dieser Einstellung wird sichergestellt, dass für Textelemente mit "User" als Standardeinstellung, zum Beispiel TextBlock, nicht die Einstellungen der Benutzeroberfläche verwendet werden.

Hierzu ein Beispiel:

<TextBlock

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

1234+5679=6913

</TextBlock>

Legen Sie im entsprechenden C#-Code die Language-Eigenschaft z. B. auf "ar-SA" fest.

text1.Language =

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

Wenn Sie die Language-Eigenschaft auf die Benutzeroberfläche-Sprache des aktuellen Benutzers festlegen müssen, verwenden Sie den folgenden Code.

text1.Language =

System.Windows.Markup.XmlLanguage.GetLanguage(

System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);

CurrentCulture repräsentiert die vom aktuellen Thread zur Laufzeit verwendete aktuelle Kultur.

Das abschließende XAML-Beispiel sollte ähnlich wie das folgende Beispiel aussehen.

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

Ein vollständiges Beispiel finden Sie unter Beispiel für Numbers2.

Das abschließende C#-Beispiel sollte ähnlich wie das folgende Beispiel 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;
            }
        }
    }
}

Das vollständige Beispiel finden Sie unter Beispiel für NumbersCSharp.

Die folgende Grafik zeigt, wie das Fenster für die beiden Programmiersprachen jeweils aussieht.

Grafik, die arabische Zahlen anzeigt

Arabische Zahlen

Verwenden der Substitution-Eigenschaft

Wie die Zahlenersetzung in Windows Presentation Foundation (WPF) funktioniert, hängt sowohl von der Sprache als auch von der FlowDirection des Textelements ab. Wenn die FlowDirection von links nach rechts ist, werden europäische Ziffern gerendert. Wenn dem Textelement jedoch arabischer Text vorangestellt ist, oder wenn die Sprache auf "ar" und die FlowDirection auf RightToLeft festgelegt ist, werden stattdessen arabische Ziffern gerendert.

Möglicherweise möchten Sie jedoch in manchen Fällen eine einheitliche Anwendung erstellen, zum Beispiel mit europäischen Ziffern für alle Benutzer, oder mit arabischen Ziffern in Table-Zellen mit einem bestimmten Style. Mit der Substitution-Eigenschaft kann dies ganz einfach erreicht werden.

Im folgenden Beispiel ist für den ersten TextBlock nicht die Substitution-Eigenschaft festgelegt, und der Algorithmus zeigt wie erwartet arabische Ziffern an. Im zweiten TextBlock ist die Ersetzung jedoch auf European festgelegt, was die Standardersetzung für arabische Zahlen überschreibt. Es werden europäische Ziffern angezeigt.

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

Ein vollständiges Beispiel finden Sie unter Numbers3-Beispiel.