Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Till skillnad från andra utvecklingsplattformar har WPF många funktioner som stöder snabb utveckling av dubbelriktat innehåll, till exempel blandade data från vänster till höger och höger till vänster i samma dokument. Samtidigt skapar WPF en utmärkt upplevelse för användare som behöver dubbelriktade funktioner som arabiska och hebreiska talande användare.
I följande avsnitt beskrivs många dubbelriktade funktioner tillsammans med exempel som illustrerar hur du får bästa möjliga visning av dubbelriktat innehåll. De flesta av exemplen använder XAML, men du kan enkelt tillämpa begreppen på C# eller Microsoft Visual Basic-kod.
FlowDirection
Den grundläggande egenskapen som definierar innehållsflödesriktningen i ett WPF-program är FlowDirection. Den här egenskapen kan anges till ett av två uppräkningsvärden, LeftToRight eller RightToLeft. Egenskapen är tillgänglig för alla WPF-element som ärver från FrameworkElement.
I följande exempel anges flödesriktningen för ett TextBox element.
flödesriktning från vänster till höger
<TextBlock Background="DarkBlue" Foreground="LightBlue"
FontSize="20" FlowDirection="LeftToRight">
This is a left-to-right TextBlock
</TextBlock>
flödesriktning från höger till vänster
<TextBlock Background="LightBlue" Foreground="DarkBlue"
FontSize="20" FlowDirection="RightToLeft">
This is a right-to-left TextBlock
</TextBlock>
Följande bild visar hur den tidigare koden återges.
Ett element i ett användargränssnittsträd ärver FlowDirection från containern. I följande exempel finns TextBlock i en Grid, som finns i en Window. Om du ställer in FlowDirection för Window innebär det också att du ställer in den för Grid och TextBlock.
I följande exempel visas inställningen 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>
Den översta nivån Window har en RightToLeftFlowDirection, så alla element som finns i den ärver också samma FlowDirection. För att ett element ska åsidosätta en angiven FlowDirection måste det lägga till en explicit riktningsändring, till exempel den andra TextBlock i föregående exempel som ändras till LeftToRight. När ingen FlowDirection har definierats gäller standard LeftToRight.
Följande bild visar utdata från föregående exempel:
Dokumentflöde
Många utvecklingsplattformar som HTML, Win32 och Java ger särskilt stöd för dubbelriktad innehållsutveckling. Påläggsspråk som HTML ger innehållsförfattare den kod som krävs för att visa text i valfri riktning, till exempel HTML 4.0-taggen, "dir" som tar "rtl" eller "ltr" som värden. Den här taggen liknar egenskapen FlowDirection, men egenskapen FlowDirection fungerar på ett mer avancerat sätt för att layoutera textinnehåll och kan användas för annat innehåll än text.
I användargränssnittselement som kan vara värd för en kombination av text, tabeller, bilder och andra element. Exemplen i följande avsnitt använder det här elementet.
Att lägga till text i en FlowDocument kan göras på mer än ett sätt. Ett enkelt sätt att göra det är genom en Paragraph som är ett blocknivåelement som används för att gruppera innehåll, till exempel text. För att lägga till text i inline-element använder exemplen Span och Run. Span är ett flödesinnehållselement på infogad nivå som används för att gruppera andra infogade element, medan ett Run är ett flödesinnehållselement på infogad nivå som är avsett att innehålla en körning av oformaterad text. En Span kan innehålla flera Run element.
Det första dokumentexemplet innehåller ett dokument som har ett antal nätverksresursnamn. till exempel \\server1\folder\file.ext. Oavsett om du har den här nätverkslänken i ett arabiskt eller engelskt dokument vill du alltid att den ska visas på samma sätt. Följande bild illustrerar hur du använder elementet Span och visar länken i ett arabiskt RightToLeft dokument:
Eftersom texten är RightToLeftavgränsar alla specialtecken, till exempel "\", texten i höger-till-vänster-ordning. Det resulterar i att länken inte visas i rätt ordning, därför måste texten bäddas in för att bevara en separat Run som flödar LeftToRight. I stället för att ha en separat Run för varje språk är ett bättre sätt att lösa problemet att bädda in den mindre använda engelska texten i en större arabisk Span.
Följande bild illustrerar detta med hjälp av run-elementet inbäddat i ett Span-element:
I följande exempel visas hur du använder Run- och Span-element i dokument.
<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>
Spanelement
Elementet Span fungerar som gränsavgränsare mellan texter med olika flödesriktningar. Även Span-element med samma flödesriktning anses ha olika dubbelriktade omfång, vilket innebär att Span-elementen är ordnade i containerns FlowDirection, och det är endast innehållet inom elementet Span som följer FlowDirection i Span.
Följande bild visar flödesriktningen för flera TextBlock element.
I följande exempel visas hur du använder elementen Span och Run för att skapa de resultat som visas i föregående bild.
<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>
I de TextBlock-elementen i exemplet är de Span-elementen ordnade i enlighet med sin förälders FlowDirection, men texten i varje Span-element flödar enligt sin egen FlowDirection. Detta gäller för latin och arabiska – eller något annat språk.
Lägga till xml:lang
Följande bild visar ett annat exempel som använder tal och aritmetiska uttryck, till exempel "200.0+21.4=221.4". Observera att endast FlowDirection har angetts.
Användare av det här programmet kommer att bli besvikna över resultatet; även om FlowDirection är korrekt, är siffrorna inte utformade som arabiska siffror ska vara.
XAML-element kan innehålla ett XML-attribut (xml:lang) som definierar språket för varje element. XAML stöder också en XML-språkprincip där xml:lang värden som tillämpas på överordnade element i trädet används av underordnade element. Eftersom ett språk inte har definierats för elementet Run eller något av dess översta element i föregående exempel användes standard xml:lang, vilket är en-US för XAML. Den interna talformningsalgoritmen för Windows Presentation Foundation (WPF) väljer tal på motsvarande språk – i det här fallet engelska. För att de arabiska siffrorna ska återges korrekt behöver xml:lang ställas in.
Följande bild visar exemplet med xml:lang har lagts till.
I följande exempel läggs xml:lang till i programmet.
<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>
Tänk på att många språk har olika xml:lang värden beroende på målregionen, till exempel "ar-SA" och "ar-EG" representerar två varianter av arabiska. Föregående exempel visar att du måste definiera både värdena för xml:lang och FlowDirection.
FlowDirection med element som inte är text
FlowDirection definierar inte bara hur text flödar i ett textelement utan även flödesriktningen för nästan alla andra UI-element. Följande bild visar en ToolBar som använder en vågrät LinearGradientBrush för att rita bakgrunden med en toning från vänster till höger.
När du har ställt in FlowDirection till RightToLeft, arrangeras inte bara knapparna ToolBar från höger till vänster, utan även LinearGradientBrush justerar sina positioner för att flöda från höger till vänster.
Följande bild visar omjusteringen av LinearGradientBrush.
I följande exempel ritas en RightToLeftToolBar. (Ta bort attributet FlowDirection på ToolBarom du vill rita det från vänster till höger.
<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-undantag
Det finns några fall där FlowDirection inte fungerar som förväntat. Det här avsnittet beskriver två av dessa undantag.
Bild
En Image representerar en kontroll som visar en bild. I XAML kan den användas med en Source egenskap som definierar den enhetliga resursidentifieraren (URI) för Image som ska visas.
Till skillnad från andra gränssnittselement ärver inte en ImageFlowDirection från containern. Men om FlowDirection uttryckligen anges till RightToLeftvisas en Image vågrätt. Detta implementeras som en praktisk funktion för utvecklare av dubbelriktat innehåll. eftersom det i vissa fall ger den önskade effekten att vända bilden vågrätt.
Följande bild visar ett omvänd Image.
Följande exempel visar att Image inte kan ärva FlowDirection från StackPanel som innehåller den.
Anmärkning
Du måste ha en fil med namnet ms_logo.jpg på C:\-enheten för att kunna köra det här exemplet.
<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>
Anmärkning
I nedladdningsfilerna ingår en ms_logo.jpg-fil. Koden förutsätter att filen .jpg inte finns i projektet utan någonstans på C:\-enheten. Du måste kopiera .jpg från projektfilerna till C:\-enheten eller ändra koden för att leta efter filen i projektet. För att göra denna ändring från Source="file://c:/ms_logo.jpg" till Source="ms_logo.jpg".
sökvägar
Ett annat intressant element, förutom en Image, är Path. En sökväg är ett objekt som kan rita en serie anslutna linjer och kurvor. Den beter sig på ett sätt som liknar en Image när det gäller dess FlowDirection; dess RightToLeftFlowDirection är till exempel en vågrät spegling av dess LeftToRight en. Men till skillnad från en Imageärver Path dess FlowDirection från containern och man behöver inte uttryckligen ange den.
I följande exempel ritas en enkel pil med tre rader. Den första pilen ärver RightToLeft flödesriktningen från StackPanel så att start- och slutpunkterna mäts från en rot på höger sida. Den andra pilen som har en explicit RightToLeftFlowDirection startar också på höger sida. Den tredje pilen har dock sin startrot till vänster. Mer information om ritning finns i LineGeometry och 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>
Följande bild visar utdata från föregående exempel med pilar ritade med hjälp av elementet Path:
Image och Path är två exempel på hur WPF använder FlowDirection. Förutom att lägga ut gränssnittselement i en specifik riktning i en container kan FlowDirection användas med element som InkPresenter som återger pennanteckning på en yta, LinearGradientBrush, RadialGradientBrush. När du behöver ett beteende från höger till vänster för ditt innehåll som efterliknar ett beteende från vänster till höger, eller tvärtom, tillhandahåller Windows Presentation Foundation (WPF) den funktionen.
Nummerersättning
Tidigare har Windows stött nummerersättning genom att tillåta representation av olika kulturella former för samma siffror samtidigt som den interna lagringen av dessa siffror är enhetlig mellan olika språk, till exempel att tal lagras i deras välkända hexadecimala värden, 0x40, 0x41, men visas enligt det valda språket.
Detta har gjort det möjligt för program att bearbeta numeriska värden utan att behöva konvertera dem från ett språk till ett annat, till exempel kan en användare öppna ett Microsoft Excel-kalkylblad i ett lokaliserat arabiskt Windows och se talen formade på arabiska, men öppna det i en europeisk version av Windows och se europeisk representation av samma tal. Detta är också nödvändigt för andra symboler som kommaavgränsare och procentsymbol eftersom de vanligtvis medföljer siffror i samma dokument.
Windows Presentation Foundation (WPF) fortsätter samma tradition och lägger till ytterligare stöd för den här funktionen som ger mer användarkontroll över när och hur ersättning används. Även om den här funktionen är utformad för alla språk är den särskilt användbar i dubbelriktat innehåll där formning av siffror för ett visst språk vanligtvis är en utmaning för programutvecklare på grund av de olika kulturer som ett program kan köras på.
Kärnegenskapen som styr hur talsubstitution fungerar i Windows Presentation Foundation (WPF) är Substitution beroendeegenskap. Klassen NumberSubstitution anger hur tal i text ska visas. Den har tre offentliga egenskaper som definierar dess beteende. Följande är en sammanfattning av var och en av egenskaperna:
Kulturkälla:
Den här egenskapen anger hur talkulturen bestäms. Det tar ett av tre NumberCultureSource uppräkningsvärden.
Åsidosättning: Nummerkulturen är densamma som för egenskapen CultureOverride.
Text: Nummerkulturen är kulturen i textbearbetningen. Vid markering skulle detta vara
xml:lang, eller dess aliasegenskapLanguage(Language eller Language). Dessutom är det standardvärdet för klasser som härleds från FrameworkContentElement. Sådana klasser omfattar System.Windows.Documents.Paragraph, System.Windows.Documents.Table, System.Windows.Documents.TableCell och så vidare.Användare: Nummerkulturen är kulturen i den aktuella tråden. Den här egenskapen är standard för alla underklasser av FrameworkElement, till exempel Page, Window och TextBlock.
CultureOverride:
Egenskapen CultureOverride används endast om egenskapen CultureSource är inställd på Override och ignoreras annars. Den specificerar talsystemskulturen. Värdet null, standardvärdet, tolkas som en-US.
Ersättning:
Den här egenskapen anger vilken typ av nummerersättning som ska utföras. Det tar något av följande NumberSubstitutionMethod uppräkningsvärden:
AsCulture: Ersättningsmetoden bestäms baserat på talkulturens NumberFormatInfo.DigitSubstitution egenskap. Det här är standardinställningen.
Context: Om talkulturen är en arabisk eller persisk kultur anger den att siffrorna är beroende av kontexten.
European: Tal återges alltid som europeiska siffror.
NativeNational: Tal återges med hjälp av nationella siffror för talkulturen, enligt vad som anges i kulturens NumberFormat.
Traditional: Tal återges med hjälp av traditionella siffror för talkulturen. För de flesta kulturer är detta samma som NativeNational. Men NativeNational resulterar i latinska siffror för vissa arabiska kulturer, medan det här värdet resulterar i arabiska siffror för alla arabiska kulturer.
Vad betyder dessa värden för en dubbelriktad innehållsutvecklare? I de flesta fall kanske utvecklaren bara behöver definiera FlowDirection och språket för varje textgränssnittselement, till exempel Language="ar-SA" och NumberSubstitution logiken tar hand om att visa talen enligt rätt användargränssnitt. I följande exempel visas hur du använder arabiska och engelska siffror i ett WPF-program (Windows Presentation Foundation) som körs i en arabisk version av Windows.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel>
<TextBlock Background="LightGreen" FontSize="32"
Language="ar-SA" FlowDirection="RightToLeft">1+2=3</TextBlock>
<TextBox Background="LightGreen" FontSize="32"
Language="ar-SA" FlowDirection="RightToLeft">1+2=3</TextBox>
<TextBlock Background="LightBlue" FontSize="32">1+2=3</TextBlock>
<TextBox Background="LightBlue" FontSize="32">1+2=3</TextBox>
</StackPanel>
</Page>
Följande bild visar utdata från föregående exempel om du kör i en arabisk version av Windows med arabiska och engelska tal som visas:
FlowDirection var viktigt i det här fallet eftersom att ställa in FlowDirection på LeftToRight i stället skulle ha gett europeiska siffror. I följande avsnitt beskrivs hur du har en enhetlig visning av siffror i hela dokumentet. Om det här exemplet inte körs i arabiska Windows visas alla siffror som europeiska siffror.
Definiera ersättningsregler
I ett riktigt program kan du behöva ange Språket programmatiskt. Du vill till exempel ange att attributet xml:lang ska vara samma som det som används av systemets användargränssnitt, eller kanske ändra språket beroende på programmets tillstånd.
Om du vill göra ändringar baserat på programmets tillstånd använder du andra funktioner som tillhandahålls av Windows Presentation Foundation (WPF).
Ange först programkomponentens NumberSubstitution.CultureSource="Text". Med den här inställningen ser du till att inställningarna inte kommer från användargränssnittet för textelement som har "Användare" som standard, till exempel TextBlock.
Till exempel:
<TextBlock
Name="text1" NumberSubstitution.CultureSource="Text">
1234+5679=6913
</TextBlock>
I motsvarande C#-kod anger du egenskapen Language, till exempel till "ar-SA".
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage("ar-SA");
Om du behöver ange egenskapen Language till den aktuella användarens användargränssnittsspråk använder du följande kod.
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);
CultureInfo.CurrentCulture representerar den aktuella kulturinställning som används av den aktuella tråden under körning.
Det sista XAML-exemplet bör likna följande exempel.
<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>
Det sista C#-exemplet bör likna följande.
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;
}
}
}
}
Följande bild visar hur fönstret ser ut för något av programmeringsspråken och visar arabiska tal:
Användning av substitutionsprincipen
Hur nummerersättning fungerar i Windows Presentation Foundation (WPF) beror på både textelementets språk och dess FlowDirection. Om FlowDirection är från vänster till höger visas europeiska siffror. Om det dock föregås av arabisk text, eller om språket har inställts till "ar" och FlowDirection är RightToLeft, återges arabiska siffror i stället.
I vissa fall kanske du dock vill skapa ett enhetligt program, till exempel europeiska siffror för alla användare. Eller arabiska siffror i Table celler med en specifik Style. Ett enkelt sätt att göra det är att använda egenskapen Substitution.
I följande exempel har den första TextBlock inte egenskapen Substitution satt, så algoritmen visar arabiska siffror som förväntat. Men i den andra TextBlockär ersättningen inställd på europeiska siffror, vilket överskrider standardersättningen för arabiska siffror, och europeiska siffror visas.
<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