Cenni preliminari sulle funzionalità bidirezionali di WPFBidirectional Features in WPF Overview

A differenza di altre piattaforme di sviluppo, WPFWPF ha molte funzionalità che supportano lo sviluppo rapido di contenuto bidirezionale, ad esempio, misto dati da sinistra a destra e a destra per sinistra nello stesso documento.Unlike any other development platform, WPFWPF has many features that support rapid development of bidirectional content, for example, mixed left to right and right to left data in the same document. Allo stesso tempo, WPFWPF crea un'esperienza eccellente per gli utenti che richiedono funzionalità bidirezionali come l'arabo ed ebraico gli utenti.At the same time, WPFWPF creates an excellent experience for users who require bidirectional features such as Arabic and Hebrew speaking users.

Le sezioni seguenti illustrano molte funzionalità bidirezionali con i relativi esempi in cui viene descritto come ottenere la migliore visualizzazione di contenuto bidirezionale.The following sections explain many bidirectional features together with examples illustrating how to achieve the best display of bidirectional content. La maggior parte degli esempi utilizza XAMLXAML, anche se è possibile applicare facilmente i concetti relativi al codice c# o Microsoft Visual Basic.Most of the samples use XAMLXAML, though you can easily apply the concepts to C# or Microsoft Visual Basic code.

FlowDirectionFlowDirection

La proprietà di base che definisce la direzione di flusso del contenuto in un WPFWPF applicazione FlowDirection.The basic property that defines the content flow direction in a WPFWPF application is FlowDirection. Questa proprietà può essere impostata su uno dei due valori di enumerazione, LeftToRight o RightToLeft.This property can be set to one of two enumeration values, LeftToRight or RightToLeft. La proprietà è disponibile a tutti i WPFWPF gli elementi che ereditano da FrameworkElement.The property is available to all WPFWPF elements that inherit from FrameworkElement.

Nell'esempio seguente impostano la direzione del flusso di un TextBox elemento.The following examples set the flow direction of a TextBox element.

Direzione di flusso da sinistra a destraLeft-to-right flow direction

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

Direzione di flusso da destra a sinistraRight-to-left flow direction

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

La figura seguente illustra il rendering del codice precedente.The following graphic shows how the previous code renders.

Figura che illustra FlowDirectionGraphic That Illustrates FlowDirection

Allineamento di TextBlockTextBlock alignment

Un elemento all'interno di un interfaccia utenteuser interface (UI) albero erediteranno il FlowDirection dal relativo contenitore.An element within a interfaccia utenteuser interface (UI) tree will inherit the FlowDirection from its container. Nell'esempio seguente, il TextBlock è all'interno di un Grid, che risiede in un Window.In the following example, the TextBlock is inside a Grid, which resides in a Window. L'impostazione di FlowDirection per il Window implica l'impostazione per il Grid e TextBlock anche.Setting the FlowDirection for the Window implies setting it for the Grid and TextBlock as well.

Nell'esempio seguente viene illustrato come impostare FlowDirection.The following example demonstrates setting 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>

Il livello principale Window ha un RightToLeft FlowDirection, pertanto anche tutti gli elementi in esso contenuti ereditano lo stesso FlowDirection.The top level Window has a RightToLeftFlowDirection, so all elements contained within it also inherit the same FlowDirection. Per un elemento eseguire l'override di un oggetto specificato FlowDirection deve aggiungere una modifica della direzione esplicita, ad esempio il secondo TextBlock nell'esempio precedente in LeftToRight.For an element to override a specified FlowDirection it must add an explicit direction change such as the second TextBlock in the previous example which changes to LeftToRight. Se non si FlowDirection è definito, il valore predefinito LeftToRight si applica.When no FlowDirection is defined, the default LeftToRight applies.

L'immagine seguente mostra l'output dell'esempio precedente.The following graphic shows the output of the previous example.

Figura che illustra l'assegnazione esplicita di FlowDirectionGraphic That Illustrates Explicitly Assigned FlowDirection

Illustrazione della direzione del flussoFlow direction illustration

FlowDocumentFlowDocument

Molte piattaforme di sviluppo, ad esempio HTMLHTML, Win32Win32 e Java forniscono uno speciale supporto per lo sviluppo di contenuto bidirezionale.Many development platforms such as HTMLHTML, Win32Win32 and Java provide special support for bidirectional content development. Linguaggi di markup, ad esempio HTMLHTML offrono agli autori dei contenuti il markup necessario per visualizzare il testo in qualsiasi direzione richiesta, ad esempio il HTMLHTML 4.0 tag, "dir" accetta "rtl" o "ltr" come valori.Markup languages such as HTMLHTML give content writers the necessary markup to display text in any required direction, for example the HTMLHTML 4.0 tag, "dir" that takes "rtl" or "ltr" as values. Questo tag è simile al FlowDirection proprietà, ma la FlowDirection proprietà funziona in modo più avanzato per il layout del contenuto testuale e può essere utilizzato per contenuti diversi dal testo.This tag is similar to the FlowDirection property, but the FlowDirection property works in a more advanced way to layout textual content and can be used for content other than text.

In WPFWPF, FlowDocument è un versatile Interfaccia utenteUI elemento che può contenere una combinazione di testo, tabelle, immagini e altri elementi.In WPFWPF, a FlowDocument is a versatile Interfaccia utenteUI element that can host a combination of text, tables, images and other elements. Gli esempi nelle sezioni seguenti usano questo elemento.The samples in the following sections use this element.

Aggiunta di testo a un FlowDocument può essere eseguita in più modi.Adding text to a FlowDocument can be done in more that one way. È un modo semplice per eseguire questa operazione tramite un Paragraph che è un elemento a livello di blocco utilizzato per raggruppare il contenuto, ad esempio testo.A simple way to do so is through a Paragraph which is a block-level element used to group content such as text. Per aggiungere testo agli elementi di livello in linea, utilizzare gli esempi Span e Run.To add text to inline-level elements the samples use Span and Run. Span è un elemento di contenuto del flusso di livello in linea utilizzato per raggruppare altri elementi in linea, mentre un Run è un flusso di livello in linea del contenuto elemento destinato a contenere una parte di testo non formattato.Span is an inline-level flow content element used for grouping other inline elements, while a Run is an inline-level flow content element intended to contain a run of unformatted text. Oggetto Span può contenere più Run elementi.A Span can contain multiple Run elements.

Nel primo esempio di documento contiene un documento con un numero di rete condividono nomi; ad esempio \\server1\folder\file.ext.The first document example contains a document that has a number of network share names; for example \\server1\folder\file.ext. Indipendentemente dal fatto che questo collegamento di rete si trovi in un documento in arabo o in inglese, si vuole che venga sempre visualizzato nello stesso modo.Whether you have this network link in an Arabic or English document, you always want it to appear in the same way. La figura seguente illustra il collegamento in un arabo RightToLeft documento.The following graphic shows the link in an Arabic RightToLeft document.

Figura che illustra l'uso dell'elemento SpanGraphic That Illustrates Using the Span Element

Documento con flusso da destra a sinistraDocument that flows from right to left

Poiché il testo è RightToLeft, speciale tutti i caratteri, ad esempio il "\", separare il testo in un ordine da destra a sinistra.Because the text is RightToLeft, all special characters, such as the "\", separate the text in a right to left order. Di conseguenza il collegamento non viene visualizzato nell'ordine corretto, pertanto, per risolvere il problema, il testo deve essere incorporato per mantenere un apposito Run flusso LeftToRight.That results in the link not being shown in the correct order, therefore to solve the problem, the text must be embedded to preserve a separate Run flowing LeftToRight. Anziché un apposito Run per ogni lingua, un modo migliore per risolvere il problema consiste nell'incorporare il testo in lingua inglese utilizzato meno frequentemente in un arabo più grande Span.Instead of having a separate Run for each language, a better way to solve the problem is to embed the less frequently used English text into a larger Arabic Span.

La figura seguente illustra questa soluzione.The following graphic illustrates this.

Figura che illustra l'uso dell'elemento Run incorporato in un elemento SpanGraphic That Illustrates Using the Run Element Embedded in a Span Element

Screenshot di XamlPadXamlPad screen shot

Nell'esempio seguente viene illustrato come utilizzare Run e Span elementi nei documenti.The following example demonstrates using Run and Span elements in documents.

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

Elementi SpanSpan Elements

Il Span elemento funziona come un separatore di limiti tra i testi con diverse direzioni di flusso.The Span element works as a boundary separator between texts with different flow directions. Anche Span elementi con la stessa direzione di flusso sono considerati diversi ambiti bidirezionali, pertanto il Span gli elementi vengono ordinati nel contenitore FlowDirection, solo il contenuto all'interno di Span elemento segue la FlowDirection del Span.Even Span elements with the same flow direction are considered to have different bidirectional scopes which means that the Span elements are ordered in the container’s FlowDirection, only the content within the Span element follows the FlowDirection of the Span.

L'immagine seguente mostra la direzione del flusso di diversi TextBlock elementi.The following graphic shows the flow direction of several TextBlock elements.

Figura che illustra FlowDirection in vari elemento TextBlockGraphic That Illustrates FlowDirection in Several TextBlock Elements

Blocchi di testo con direzioni di flusso diverseText blocks with different flow directions

Nell'esempio seguente viene illustrato come utilizzare il Span e Run elementi da produrre i risultati mostrati nell'immagine precedente.The following example shows how to use the Span and Run elements to produce the results shown in the previous graphic.

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

Nel TextBlock elementi dell'esempio, il Span elementi vengono disposti in base al FlowDirection dei relativi elementi padre, ma il testo all'interno di ogni Span elemento scorre in base alla propria FlowDirection.In the TextBlock elements in the sample, the Span elements are laid out according to the FlowDirection of their parents, but the text within each Span element flows according to its own FlowDirection. Questa condizione può essere applicata all'alfabeto latino e arabo oppure a qualsiasi altra lingua.This is applicable to Latin and Arabic – or any other language.

Aggiunta di xml:langAdding xml:lang

La figura seguente illustra un altro esempio che utilizza numeri ed espressioni aritmetiche, ad esempio "200.0+21.4=221.4".The following graphic shows another example that uses numbers and arithmetic expressions, such as "200.0+21.4=221.4". Si noti che solo il FlowDirection è impostata.Notice that only the FlowDirection is set.

Figura che illustra come la visualizzazione di numero usando solo FlowDirectionGraphic That Displays Numbers Using Only FlowDirection

Numeri con flusso da destra a sinistraNumbers that flow from right to left

Gli utenti dell'applicazione verranno ricompensa dall'output, anche se il FlowDirection i numeri non sono forma numeri arabi devono essere corretto.Users of this application will be disappointed by the output, even though the FlowDirection is correct the numbers are not shaped as Arabic numbers should be shaped.

Gli elementi XAML possono includere un XMLXML attributo (xml:lang) che definisce la lingua di ogni elemento.XAML elements can include an XMLXML attribute (xml:lang) that defines the language of each element. XAML supporta inoltre un XMLXML principio di lingua in base al quale xml:lang applicati agli elementi padre nell'albero di valori vengono utilizzati dagli elementi figlio.XAML also supports a XMLXML language principle whereby xml:lang values applied to parent elements in the tree are used by child elements. Nell'esempio precedente, perché non è stata definita una lingua per il Run elemento o primo livello gli elementi, il valore predefinito xml:lang è stato utilizzato, ovvero en-US per XAML.In the previous example, because a language was not defined for the Run element or any of its top level elements, the default xml:lang was used, which is en-US for XAML. L'algoritmo di data shaping numero interno di Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) seleziona i numeri nella lingua corrispondente, in questo caso l'inglese.The internal number shaping algorithm of Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) selects numbers in the corresponding language – in this case English. Per rendere l'arabo correttamente rendering dei numeri xml:lang deve essere impostata.To make the Arabic numbers render correctly xml:lang needs to be set.

Nella figura seguente viene illustrato l'esempio con xml:lang aggiunto.The following graphic shows the example with xml:lang added.

Figura che illustra l'uso dell'attributo xml:langGraphic That Illustrates Using the xml:lang Attribute

Numeri arabi con flusso da destra a sinistraArabic numbers that flow from right to left

L'esempio seguente aggiunge xml:lang all'applicazione.The following example adds xml:lang to the application.

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

Tenere presente che molte lingue hanno diversi xml:lang valori a seconda dell'area di destinazione, ad esempio, "ar-SA" e "ar-EG" rappresentano due varianti dell'arabo.Be aware that many languages have different xml:lang values depending on the targeted region, for example, "ar-SA" and "ar-EG" represent two variations of Arabic. Negli esempi precedenti viene illustrato che è necessario definire entrambi il xml:lang e FlowDirection valori.The previous examples illustrate that you need to define both the xml:lang and FlowDirection values.

FlowDirection con elementi non di testoFlowDirection with Non-text Elements

FlowDirection definisce non solo orientamento del testo in un elemento testuale, ma anche la direzione del flusso di quasi tutti gli altri Interfaccia utenteUI elemento.FlowDirection defines not only how text flows in a textual element but also the flow direction of almost every other Interfaccia utenteUI element. Nell'immagine seguente viene illustrata una ToolBar che utilizza un oggetto orizzontale LinearGradientBrush per disegnare lo sfondo.The following graphic shows a ToolBar that uses a horizontal LinearGradientBrush to draw its background.

Immagine che mostra una barra degli strumenti con sfumatura da sinistra a destraGraphic That Shows a ToolBar with a Left to Right Gradient

Screenshot della sfumaturaGradient screen shot

Dopo aver impostato la FlowDirection a RightToLeft, non solo il ToolBar pulsanti vengono disposte da destra a sinistra, ma anche il LinearGradientBrush si allineano nuovamente gli offset in modo che scorrano da destra a sinistra.After setting the FlowDirection to RightToLeft, not only the ToolBar buttons are arranged from right to left, but even the LinearGradientBrush realigns its offsets to flow from right to left.

La figura seguente illustra il riallineamento del LinearGradientBrush.The following graphic shows the realignment of the LinearGradientBrush.

Immagine che illustra una barra degli strumenti con una sfumatura da destra a sinistraGraphic That Shows a ToolBar with a Right to Left Gradient

Sfumatura con flusso da destra a sinistraA gradient that flows from right to left

Nell'esempio seguente disegna un RightToLeft ToolBar.The following example draws a RightToLeftToolBar. (Per disegnarlo da sinistra a destra, rimuovere il FlowDirection attributo la ToolBar.(To draw it left to right, remove the FlowDirection attribute on the 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>

Eccezioni di FlowDirectionFlowDirection Exceptions

Esistono alcuni casi in cui FlowDirection non funzionino come previsto.There are a few cases where FlowDirection does not behave as expected. In questa sezione vengono illustrate due di queste eccezioni.This section covers two of these exceptions.

ImmagineImage

Un Image rappresenta un controllo che visualizza un'immagine.An Image represents a control that displays an image. In XAMLXAML e può essere utilizzato con un Source proprietà che definisce il Uniform Resource Identifier (URI)uniform resource identifier (URI) del Image da visualizzare.In XAMLXAML it can be used with a Source property that defines the Uniform Resource Identifier (URI)uniform resource identifier (URI) of the Image to display.

A differenza degli altri Interfaccia utenteUI elementi, un Image non eredita il FlowDirection dal contenitore.Unlike other Interfaccia utenteUI elements, an Image does not inherit the FlowDirection from the container. Tuttavia, se il FlowDirection è impostato in modo esplicito su RightToLeft, un Image viene visualizzato in senso orizzontale capovolto.However, if the FlowDirection is set explicitly to RightToLeft, an Image is displayed flipped horizontally. Questa condizione viene implementata come una funzionalità utile per gli sviluppatori di contenuti bidirezionali, perché in alcuni casi il capovolgimento in senso orizzontale dell'immagine genera l'effetto desiderato.This is implemented as a convenient feature for developers of bidirectional content; because in some cases, horizontally flipping the image produces the desired effect.

La figura seguente illustra un capovolta Image.The following graphic shows a flipped Image.

Immagine che illustra un'immagine capovoltaGraphic That Illustrates a Flipped Image

Screenshot di XamlPadXamlPad screen shot

Nell'esempio seguente viene dimostrato che la Image non riesce a ereditare il FlowDirection dal StackPanel che lo contiene.The following example demonstrates that the Image fails to inherit the FlowDirection from the StackPanel that contains it. Nota è necessario disporre di un file denominato ms_logo nell'unità C:\ per eseguire questo esempio.Note You must have a file named ms_logo.jpg on your C:\ drive to run this example.

<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 è incluso nei file di download un' ms_logo file.Note Included in the download files is an ms_logo.jpg file. Nel codice si presuppone che il file con estensione jpg non si trovi all'interno del progetto ma in un'altra posizione nell'unità C:.The code assumes that the .jpg file is not inside your project but somewhere on the C:\ drive. È necessario copiare il file con estensione jpg dai file di progetto nell'unità C:\ oppure modificare il codice affinché la ricerca venga eseguita all'interno del progetto.You must copy the .jpg from the project files to your C:\ drive or change the code to look for the file inside the project. A tale scopo, modificare Source="file://c:/ms_logo.jpg" a Source="ms_logo.jpg".To do this change Source="file://c:/ms_logo.jpg" to Source="ms_logo.jpg".

PercorsiPaths

Oltre a un Image, un altro elemento interessante è Path.In addition to an Image, another interesting element is Path. Path è un oggetto che consente di disegnare una serie di righe e curve collegate.A Path is an object that can draw a series of connected lines and curves. Si comporta in modo simile a un Image per quanto riguarda il FlowDirection, ad esempio relativi RightToLeft FlowDirection è un'immagine speculare orizzontale di relativo LeftToRight uno.It behaves in a manner similar to an Image regarding its FlowDirection; for example its RightToLeftFlowDirection is a horizontal mirror of its LeftToRight one. Tuttavia, a differenza di un Image, Path eredita relativo FlowDirection dal contenitore e uno non è necessario specificarlo in modo esplicito.However, unlike an Image, Path inherits its FlowDirection from the container and one does not need to specify it explicitly.

L'esempio seguente disegna una freccia semplice con 3 linee.The following example draws a simple arrow using 3 lines. La prima freccia eredita il RightToLeft direzione del flusso di StackPanel in modo che i punti iniziale e finale sono misurati da una radice sul lato destro.The first arrow inherits the RightToLeft flow direction from the StackPanel so that its start and end points are measured from a root on the right side. La seconda freccia è esplicita RightToLeft FlowDirection inoltre avviato sul lato destro.The second arrow which has an explicit RightToLeftFlowDirection also starts on the right side. Tuttavia, la radice iniziale della terza freccia è collocata sul lato sinistro.However, the third arrow has its starting root on the left side. Per ulteriori informazioni sul disegno, vedere LineGeometry e GeometryGroup.For more information on drawing see LineGeometry and 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>

L'immagine seguente mostra l'output dell'esempio precedente.The following graphic shows the output of the previous example.

Immagine che illustra le frecce disegnate usando l'elemento PathGraphic That Illustrates Arrows Drawn Using the Path Element

PathsPaths

Il Image e Path sono riportati due esempi di come Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) utilizza FlowDirection.The Image and Path are two examples of a how Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) uses FlowDirection. Oltre a disporre gli Interfaccia utenteUI elementi in una direzione specifica all'interno di un contenitore, FlowDirection può essere utilizzato con gli elementi, ad esempio InkPresenter che esegue il rendering dell'input penna su una superficie, LinearGradientBrush, RadialGradientBrush.Beside laying out Interfaccia utenteUI elements in a specific direction within a container, FlowDirection can be used with elements such as InkPresenter which renders ink on a surface, LinearGradientBrush, RadialGradientBrush. Ogni volta che è necessario un comportamento da destra a sinistro del contenuto che simula un comportamento da sinistra a destra, o viceversa, Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) disponibile tale funzionalità.Whenever you need a right to left behavior for your content that mimics a left to right behavior, or vice versa, Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) provides that capability.

Sostituzione numericaNumber Substitution

In passato, WindowsWindows è supportata la sostituzione dei numeri, consentendo la rappresentazione di diverse forme relative alla lingua per le cifre stesso mantenendo l'archiviazione interna di queste cifre unificata le diverse impostazioni locali, ad esempio i numeri vengono memorizzati i noti valori esadecimali, 0x40, 0x41, ma visualizzati in base alla lingua selezionata.Historically, WindowsWindows has supported number substitution by allowing the representation of different cultural shapes for the same digits while keeping the internal storage of these digits unified among different locales, for example numbers are stored in their well known hexadecimal values, 0x40, 0x41, but displayed according to the selected language.

Ciò è consentito alle applicazioni di elaborare valori numerici senza la necessità di convertirli da una lingua a un'altra, ad esempio un utente può aprire un Microsoft ExcelMicrosoft Excel foglio di calcolo in un arabo localizzata WindowsWindows e visualizzare i numeri in arabo, ma aprirli in versione europea di WindowsWindows e visualizzando la rappresentazione europea degli stessi numeri.This has allowed applications to process numerical values without the need to convert them from one language to another, for example a user can open an Microsoft ExcelMicrosoft Excel spreadsheet in a localized Arabic WindowsWindows and see the numbers shaped in Arabic, but open it in a European version of WindowsWindows and see European representation of the same numbers. Questa condizione è necessaria anche per altri simboli, quali i separatori virgola e il simbolo della percentuale, perché sono spesso associati a numeri nello stesso documento.This is also necessary for other symbols such as comma separators and percentage symbol because they usually accompany numbers in the same document.

In Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) è stata mantenuta la stessa tradizione e aggiunto un ulteriore supporto a questa funzionalità che consente un maggiore controllo dell'utente sul momento e sulla modalità d'su della sostituzione.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) continues the same tradition, and adds further support for this feature that allows more user control over when and how substitution is used. Sebbene questa funzionalità sia stata progettata per tutte le lingue, è particolarmente utile per i contenuti bidirezionali in cui la definizione delle cifre per una lingua specifica rappresenta solitamente una sfida per gli sviluppatori di applicazioni, a causa delle diverse impostazioni cultura con cui un'applicazione può essere eseguita.While this feature is designed for any language, it is particularly useful in bidirectional content where shaping digits for a specific language is usually a challenge for application developers because of the various cultures an application might run on.

La proprietà di base controllare la modalità sostituzione Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) è il Substitution proprietà di dipendenza.The core property controlling how number substitution works in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) is the Substitution dependency property. La NumberSubstitution classe specifica la modalità dei numeri nel testo da visualizzare.The NumberSubstitution class specifies how numbers in text are to be displayed. Include tre proprietà pubbliche che ne definiscono il comportamento.It has three public properties that define its behavior. Di seguito è riportato un riepilogo di tutte le proprietà.Following is a summary of each of the properties.

CultureSource:CultureSource:

Questa proprietà specifica come vengono determinate le impostazioni cultura per i numeri.This property specifies how the culture for numbers is determined. Accetta uno dei tre NumberCultureSource valori di enumerazione.It takes one of three NumberCultureSource enumeration values.

CultureOverride:CultureOverride:

Il CultureOverride proprietà viene utilizzata solo se il CultureSource è impostata su Override e viene ignorato in caso contrario.The CultureOverride property is used only if the CultureSource property is set to Override and is ignored otherwise. Specifica le impostazioni cultura del numero.It specifies the number culture. Il valore null, il valore predefinito, viene interpretato come en-US.A value of null, the default value, is interpreted as en-US.

Substitution:Substitution:

Questa proprietà specifica il tipo di sostituzione numerica da eseguire.This property specifies the type of number substitution to perform. Accetta uno dei seguenti NumberSubstitutionMethod valori di enumerazione.It takes one of the following NumberSubstitutionMethod enumeration values.

  • AsCulture: Il metodo di sostituzione viene determinato in base alle impostazioni cultura del numero NumberFormatInfo.DigitSubstitution proprietà.AsCulture: The substitution method is determined based on the number culture's NumberFormatInfo.DigitSubstitution property. Questa è l'impostazione predefinita.This is the default.

  • Context: Se il numero delle impostazioni cultura sono una lingua araba o Farsi, specifica che le cifre dipendono dal contesto.Context: If the number culture is an Arabic or Farsi culture, it specifies that the digits depend on the context.

  • European: I numeri vengono sempre visualizzati come cifre europee.European: Numbers are always rendered as European digits.

  • NativeNational: Numeri sono sottoposti a rendering utilizzando le cifre nazionali per impostazioni cultura del numero, come specificato dalle impostazioni cultura NumberFormat.NativeNational: Numbers are rendered using the national digits for the number culture, as specified by the culture's NumberFormat.

  • Traditional: I numeri vengono visualizzati utilizzando le cifre tradizionali per impostazioni cultura del numero.Traditional: Numbers are rendered using the traditional digits for the number culture. Per la maggior parte delle impostazioni cultura, queste sono le stesse NativeNational.For most cultures, this is the same as NativeNational. Tuttavia, NativeNational risultati cifre latine per alcune impostazioni cultura arabe, mentre questo valore in cifre arabe per tutte le lingue arabe.However, NativeNational results in Latin digits for some Arabic cultures, whereas this value results in Arabic digits for all Arabic cultures.

Cosa significano questi valori per uno sviluppatore di contenuti bidirezionali?What do those values mean for a bidirectional content developer? Nella maggior parte dei casi, lo sviluppatore deve solo definire FlowDirection e la lingua del testo di ogni Interfaccia utenteUI elemento, ad esempio Language="ar-SA" e NumberSubstitution logica occupa la visualizzazione dei numeri in base alle corrette Interfaccia utenteUI.In most cases, the developer might need only to define FlowDirection and the language of each textual Interfaccia utenteUI element, for example Language="ar-SA" and the NumberSubstitution logic takes care of displaying the numbers according to the correct Interfaccia utenteUI. Nell'esempio seguente viene illustrato l'utilizzo di numeri in arabo e inglese in un Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) applicazione in esecuzione in una versione araba di WindowsWindows.The following example demonstrates using Arabic and English numbers in a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) application running in an Arabic version of WindowsWindows.

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

La figura seguente illustra l'output dell'esempio precedente, se si esegue una versione araba di WindowsWindows.The following graphic shows the output of the previous sample if you are running in an Arabic version of WindowsWindows.

Immagine che illustra i numeri arabi e inglesi visualizzatiGraphic That Shows Arabic and English Numbers Displayed

Screenshot di XamlPad con numeriXamlPad screen shot with numbers

Il FlowDirection era importante in questo caso, poiché l'impostazione di FlowDirection a LeftToRight avrebbe prodotto cifre europee.The FlowDirection was important in this case because setting the FlowDirection to LeftToRight instead would have yielded European digits. Le sezioni seguenti descrivono come ottenere una visualizzazione unificata delle cifre in tutto il documento.The following sections discuss how to have a unified display of digits throughout your document. Se l'esempio non viene eseguito nella versione araba di Windows, tutte le cifre vengono visualizzate come cifre europee.If this example is not running on Arabic Windows, all the digits display as European digits.

Definizione delle regole di sostituzioneDefining Substitution Rules

In un'applicazione reale, è necessario impostare l'oggetto Language a livello di codice.In a real application you might need to set the Language programmatically. Ad esempio, si desidera impostare il xml:lang attributo deve corrispondere a quello utilizzato per il sistema Interfaccia utenteUI, o modificare la lingua in base allo stato dell'applicazione.For example, you want to set the xml:lang attribute to be the same as the one used by the system’s Interfaccia utenteUI, or maybe change the language depending on the application state.

Se si desidera apportare modifiche in base allo stato dell'applicazione, utilizzare altre funzionalità fornite da Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).If you want to make changes based on the application's state, make use of other features provided by Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).

Innanzitutto, impostare il componente di applicazione NumberSubstitution.CultureSource="Text".First, set the application component’s NumberSubstitution.CultureSource="Text". Utilizzo di questa impostazione garantisce che le impostazioni non provengono dal Interfaccia utenteUI per elementi di testo "User" come valore predefinito, ad esempio TextBlock.Using this setting makes sure that the settings do not come from the Interfaccia utenteUI for text elements that have "User" as the default, such as TextBlock.

Ad esempio:For example:

||
|-|
|<TextBlock

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

1234+5679=6913

</TextBlock>|

Nel corrispondente codice c#, impostare il Language proprietà, ad esempio, per "ar-SA".In the corresponding C# code, set the Language property for example, to "ar-SA".

||
|-|
|text1.Language =

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

Se è necessario impostare il Language proprietà per l'utente corrente Interfaccia utenteUI lingua da utilizzare per il codice seguente.If you need to set the Language property to the current user’s Interfaccia utenteUI language use the following code.

||
|-|
|text1.Language =

System.Windows.Markup.XmlLanguage.GetLanguage(

System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);|

CurrentCulture rappresenta le impostazioni cultura correnti usate dal thread corrente in fase di esecuzione.CurrentCulture represents the current culture used by the current thread at run time.

Il finale XAMLXAML esempio dovrebbe essere simile all'esempio seguente.Your final XAMLXAML example should be similar to the following example.

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

L'esempio c# finale dovrebbe essere simile al seguente.Your final C# example should be similar to the following.

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

L'immagine seguente mostra l'aspetto della finestra per entrambi i linguaggi di programmazione.The following graphic shows what the window looks like for either programming language.

Immagine che visualizza i numeri arabiGraphic That Displays Arabic Numbers

Numeri arabiArabic numbers

Uso della proprietà SubstitutionUsing the Substitution Property

La sostituzione numerica funziona in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) dipende dalla lingua dell'elemento di testo e il relativo FlowDirection.The way number substitution works in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) depends on both the Language of the text element and its FlowDirection. Se il FlowDirection da sinistra a destra, quindi vengono eseguito il rendering delle cifre europee.If the FlowDirection is left to right, then European digits are rendered. Tuttavia è preceduto da un testo arabo, se è la lingua impostata su "ar" e FlowDirection è RightToLeft, vengono eseguito il rendering delle cifre arabe.However if it is preceded by Arabic text, or has the language set to "ar" and the FlowDirection is RightToLeft, Arabic digits are rendered instead.

In alcuni casi, tuttavia, è possibile creare un'applicazione unificata usando, ad esempio, le cifre europee per tutti gli utentiIn some cases, however, you might want to create a unified application, for example European digits for all users. Oppure cifre arabe nelle Table celle con una versione specifica Style.Or Arabic digits in Table cells with a specific Style. Un modo semplice per ottenere che utilizza il Substitution proprietà.One easy way to do that is using the Substitution property.

Nell'esempio seguente, il primo TextBlock non dispone di Substitution proprietà impostata, pertanto l'algoritmo consente di visualizzare le cifre arabe come previsto.In the following example, the first TextBlock does not have the Substitution property set, so the algorithm displays Arabic digits as expected. Tuttavia nel secondo TextBlock, la sostituzione viene impostata su European si esegue l'override della sostituzione predefinita per i numeri arabi e vengono visualizzate le cifre europee.However in the second TextBlock, the substitution is set to European overriding the default substitution for Arabic numbers, and European digits are displayed.

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