Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W odróżnieniu od każdej innej platformy, WPF ma wiele funkcji wspierających szybki rozwój dwukierunkowej zawartości, na przykład mieszanie danych od lewej do prawej i od prawej do lewej w tym samym dokumencie. Jednocześnie WPF tworzy doskonałe środowisko dla użytkowników, którzy wymagają dwukierunkowych funkcji, takich jak użytkownicy języka arabskiego i hebrajskiego.
W poniższych sekcjach opisano wiele dwukierunkowych funkcji wraz z przykładami ilustrującymi sposób uzyskania najlepszego wyświetlania zawartości dwukierunkowej. Większość przykładów używa języka XAML, ale można łatwo zastosować koncepcje do kodu W# lub Microsoft Visual Basic.
FlowDirection
Podstawowa właściwość, która definiuje kierunek przepływu zawartości w aplikacji WPF, jest FlowDirection. Tę właściwość można ustawić na jedną z dwóch wartości wyliczenia, LeftToRight lub RightToLeft. Właściwość jest dostępna dla wszystkich elementów WPF, które dziedziczą po FrameworkElement.
W poniższych przykładach ustawiono kierunek przepływu elementu TextBox.
kierunku przepływu od lewej do prawej
<TextBlock Background="DarkBlue" Foreground="LightBlue"
FontSize="20" FlowDirection="LeftToRight">
This is a left-to-right TextBlock
</TextBlock>
kierunek przepływu od prawej do lewej
<TextBlock Background="LightBlue" Foreground="DarkBlue"
FontSize="20" FlowDirection="RightToLeft">
This is a right-to-left TextBlock
</TextBlock>
Na poniższej ilustracji przedstawiono sposób renderowania poprzedniego kodu.
Element w drzewie interfejsu użytkownika będzie dziedziczyć FlowDirection ze swojego kontenera. W poniższym przykładzie TextBlock znajduje się wewnątrz Grid, który znajduje się w Window. Ustawienie FlowDirection dla Window oznacza ustawienie go również dla Grid i TextBlock.
W poniższym przykładzie pokazano ustawienie 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>
Window najwyższego poziomu ma RightToLeftFlowDirection, więc wszystkie zawarte w nim elementy również dziedziczą ten sam FlowDirection. Aby element przesłonił określony FlowDirection, musi dodać jawną zmianę kierunku, taką jak drugi TextBlock w poprzednim przykładzie, który zmienia na LeftToRight. Jeśli nie zdefiniowano FlowDirection, ma zastosowanie LeftToRight domyślne.
Na poniższej ilustracji przedstawiono dane wyjściowe z poprzedniego przykładu:
FlowDocument
Wiele platform programistycznych, takich jak HTML, Win32 i Java, zapewnia specjalną obsługę programowania zawartości dwukierunkowej. Języki znaczników, takie jak HTML, dają autorom zawartości niezbędne znaczniki do wyświetlania tekstu w dowolnym wymaganym kierunku, na przykład tag HTML 4.0, "dir", który przyjmuje "rtl" lub "ltr" jako wartości. Ten tag jest podobny do właściwości FlowDirection, ale właściwość FlowDirection działa w bardziej zaawansowany sposób układu zawartości tekstowej i może służyć do zawartości innej niż tekst.
W elemecie interfejsu użytkownika, który może hostować kombinację tekstu, tabel, obrazów i innych elementów. Przykłady w poniższych sekcjach używają tego elementu.
Dodawanie tekstu do FlowDocument można wykonać na więcej niż jeden sposób. Prostym sposobem na to jest użycie Paragraph, który jest elementem na poziomie bloku używanym do grupowania zawartości, takiej jak tekst. Aby dodać tekst do elementów typu inline, przykłady używają Span i Run. Span jest elementem przepływu śródwierszowego używanym do grupowania innych elementów wbudowanych, a Run jest elementem przepływu śródwierszowego przeznaczonym do zawierania niesformatowanego tekstu. Span może zawierać wiele elementów Run.
Pierwszy przykład dokumentu zawiera dokument zawierający wiele nazw udziałów sieciowych; na przykład \\server1\folder\file.ext. Niezależnie od tego, czy masz ten link sieciowy w dokumencie arabskim, czy angielskim, zawsze chcesz, aby był on wyświetlany w taki sam sposób. Poniższa ilustracja ilustruje użycie elementu Span i pokazuje link w dokumencie RightToLeft arabskim:
Ponieważ tekst jest RightToLeft, wszystkie znaki specjalne, takie jak "\", oddzielają tekst od prawej do lewej kolejności. Powoduje to, że łącze nie wyświetla się we właściwej kolejności, dlatego, aby rozwiązać problem, tekst musi być osadzony, aby zachować osobny przepływ Run i LeftToRight. Zamiast mieć oddzielny Run dla każdego języka, lepszym sposobem rozwiązania problemu jest osadzanie rzadziej używanego tekstu w języku angielskim w większym arabskim Span.
Poniższa ilustracja ilustruje to przy użyciu elementu Run osadzonego w elemecie Span:
W poniższym przykładzie pokazano użycie elementów Run i Span w dokumentach.
<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>
Elementy zakresu
Element Span działa jako separator granic między tekstami z różnymi kierunkami przepływu. Nawet elementy Span o tym samym kierunku przepływu są uważane za mające różne zakresy dwukierunkowe, co oznacza, że elementy Span są uporządkowane w kontenerze FlowDirection, a tylko zawartość w elemencie Span jest zgodna z kolejnością FlowDirection w ramach Span.
Poniższa ilustracja przedstawia kierunek przepływu kilku elementów TextBlock.
W poniższym przykładzie pokazano, jak używać elementów Span i Run w celu wygenerowania wyników przedstawionych na poprzedniej grafice.
<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>
W elementach TextBlock w przykładzie, elementy Span są rozmieszczone zgodnie z FlowDirection ich elementów nadrzędnych, ale tekst w każdym elemencie Span przepływa zgodnie z własnym FlowDirection. Dotyczy to języków łacińskich i arabskich lub innych.
Dodawanie pliku xml:lang
Na poniższej ilustracji przedstawiono inny przykład, który używa liczb i wyrażeń arytmetycznych, takich jak "200.0+21.4=221.4". Zwróć uwagę, że ustawiono tylko FlowDirection.
Użytkownicy tej aplikacji będą rozczarowani wynikiem, mimo że FlowDirection jest poprawne, liczby nie są uformowane tak, jak powinny być formowane liczby arabskie.
Elementy XAML mogą zawierać atrybut XML (xml:lang), który definiuje język każdego elementu. Język XAML obsługuje również zasadę języka XML, w której xml:lang wartości stosowane do elementów nadrzędnych w drzewie są używane przez elementy podrzędne. W poprzednim przykładzie, ponieważ język nie został zdefiniowany dla elementu Run lub któregokolwiek z jego elementów najwyższego poziomu, użyto domyślnego xml:lang, który jest en-US dla języka XAML. Wewnętrzny algorytm kształtowania liczb programu Windows Presentation Foundation (WPF) wybiera liczby w odpowiednim języku — w tym przypadku w języku angielskim. Aby liczby arabskie były poprawnie renderowane, należy ustawić xml:lang.
Poniższa ilustracja przedstawia przykład z dodanym xml:lang.
Poniższy przykład dodaje xml:lang do aplikacji.
<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>
Należy pamiętać, że wiele języków ma różne wartości xml:lang w zależności od regionu docelowego, na przykład "ar-SA" i "ar-EG" reprezentują dwie odmiany języka arabskiego. W poprzednich przykładach pokazano, że należy zdefiniować zarówno wartości xml:lang, jak i FlowDirection.
FlowDirection z elementami nietekstowymi
FlowDirection definiuje nie tylko sposób przepływu tekstu w elemecie tekstowym, ale także kierunek przepływu niemal każdego innego elementu interfejsu użytkownika. Na ilustracji pokazano ToolBar, która używa poziomej LinearGradientBrush do rysowania tła z gradientem przebiegającym od lewej do prawej.
Po ustawieniu FlowDirection na RightToLeftnie tylko przyciski ToolBar są rozmieszczone od prawej do lewej, ale nawet LinearGradientBrush dopasowuje swoje przesunięcia do układu od prawej do lewej.
Na poniższej grafice przedstawiono przeorganizowanie LinearGradientBrush.
Poniższy przykład przedstawia RightToLeftToolBar. (Aby narysować go od lewej do prawej, usuń atrybut FlowDirection na 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>
Wyjątki „FlowDirection”
Istnieje kilka przypadków, w których FlowDirection nie zachowuje się zgodnie z oczekiwaniami. W tej sekcji omówiono dwa z tych wyjątków.
Obraz
Image reprezentuje kontrolkę, która wyświetla obraz. W języku XAML można go używać z właściwością Source definiującą identyfikator URI (uniform resource identifier) Image do wyświetlenia.
W przeciwieństwie do innych elementów interfejsu użytkownika, Image nie dziedziczy FlowDirection z kontenera. Jeśli jednak FlowDirection jest jawnie ustawiony na RightToLeft, Image jest wyświetlany odwrócony w poziomie. Jest to zaimplementowana jako wygodna funkcja dla deweloperów zawartości dwukierunkowej; ponieważ w niektórych przypadkach przerzucanie obrazu w poziomie daje pożądany efekt.
Na poniższej ilustracji przedstawiono odwrócony Image.
W poniższym przykładzie pokazano, że Image nie dziedziczy FlowDirection z StackPanel, która go zawiera.
Uwaga / Notatka
Aby uruchomić ten przykład, musisz mieć plik o nazwie ms_logo.jpg na dysku C:\.
<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>
Uwaga / Notatka
W plikach do pobrania znajduje się plik ms_logo.jpg. W kodzie przyjęto założenie, że plik .jpg nie znajduje się w projekcie, ale gdzieś na dysku C:\. Musisz skopiować .jpg z plików projektu na dysk C:\ lub zmienić kod, aby wyszukać plik wewnątrz projektu. Aby to zrobić, zmień Source="file://c:/ms_logo.jpg" na Source="ms_logo.jpg".
Ścieżki
Oprócz Image, innym interesującym elementem jest Path. Ścieżka to obiekt, który może rysować serię połączonych linii i krzywych. Zachowuje się podobnie jak Image pod względem FlowDirection; na przykład jego RightToLeftFlowDirection jest poziomym odbiciem lustrzanym jego LeftToRight. Jednak w przeciwieństwie do ImagePath dziedziczy FlowDirection z kontenera i nie musi jawnie go określać.
Poniższy przykład rysuje prostą strzałkę przy użyciu 3 wierszy. Pierwsza strzałka dziedziczy kierunek przepływu RightToLeft z StackPanel, tak aby jej punkty początkowy i końcowy były mierzone względem korzenia po prawej stronie. Druga strzałka, która ma wyraźnie zaznaczone RightToLeftFlowDirection, również zaczyna się po prawej stronie. Jednak trzecia strzałka ma swój pierwiastek początkowy po lewej stronie. Aby uzyskać więcej informacji na temat rysowania, zobacz LineGeometry i 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>
Poniższa grafika przedstawia dane wyjściowe poprzedniego przykładu ze strzałkami rysowanymi przy użyciu elementu Path:
Image i Path to dwa przykłady na to, jak WPF używa FlowDirection. Oprócz układania elementów interfejsu użytkownika w określonym kierunku w kontenerze, FlowDirection można używać z elementami takimi jak InkPresenter, które renderują atrament na powierzchni, oraz LinearGradientBrushi RadialGradientBrush. Gdy potrzebujesz zachowania od prawej do lewej dla swojej zawartości, które naśladuje zachowanie od lewej do prawej lub odwrotnie, Windows Presentation Foundation (WPF) oferuje tę możliwość.
Podstawianie liczb
W przeszłości system Windows obsługiwał zastępowanie cyfr, umożliwiając reprezentację różnych kształtów związanych z kulturą dla tych samych cyfr przy zachowaniu wewnętrznej reprezentacji tych cyfr ujednoliconej między różnymi ustawieniami regionalnymi. Na przykład, liczby są przechowywane w dobrze znanych wartościach szesnastkowych, takich jak 0x40, 0x41, ale wyświetlane zgodnie z wybranym językiem.
Umożliwiło to aplikacjom przetwarzanie wartości liczbowych bez konieczności konwertowania ich z jednego języka na inny, na przykład użytkownik może otworzyć arkusz kalkulacyjny programu Microsoft Excel w zlokalizowanym arabskim systemie Windows i zobaczyć liczby w kształcie języka arabskiego, ale otworzyć je w europejskiej wersji systemu Windows i zobaczyć europejską reprezentację tych samych liczb. Jest to również konieczne w przypadku innych symboli, takich jak separatory przecinków i symbol procentowy, ponieważ zwykle towarzyszą one liczbom w tym samym dokumencie.
Windows Presentation Foundation (WPF) kontynuuje tę samą tradycję i dodaje dalszą obsługę tej funkcji, która umożliwia użytkownikom większą kontrolę nad tym, kiedy i w jaki sposób jest stosowane podstawianie. Chociaż ta funkcja jest przeznaczona dla dowolnego języka, jest szczególnie przydatna w dwukierunkowej zawartości, w której kształtowanie cyfr dla określonego języka jest zwykle wyzwaniem dla deweloperów aplikacji ze względu na różne kultury, na których może działać aplikacja.
Podstawowa właściwość kontrolująca sposób podstawiania liczb w Windows Presentation Foundation (WPF) to właściwość zależności Substitution. Klasa NumberSubstitution określa sposób wyświetlania liczb w tekście. Ma trzy właściwości publiczne, które definiują jego zachowanie. Poniżej przedstawiono podsumowanie każdej właściwości:
Źródło kultury:
Ta właściwość określa sposób określania kultury liczb. Przyjmuje jedną z trzech NumberCultureSource wartości wyliczenia.
Nadpisanie: kultura liczbowa jest zgodna z właściwością CultureOverride.
Tekst: kultura liczbowa jest kulturą przebiegu tekstu. W znaczniku będzie to
xml:langlub jego alias, właściwośćLanguage(Language lub Language). Ponadto jest to wartość domyślna dla klas pochodnych z FrameworkContentElement. Takie klasy obejmują System.Windows.Documents.Paragraph, System.Windows.Documents.Table, System.Windows.Documents.TableCell itd.Użytkownik: Kultura liczb jest kulturą bieżącego wątku. Ta właściwość jest domyślna dla wszystkich podklas FrameworkElement, takich jak Page, Window i TextBlock.
CultureOverride:
Właściwość CultureOverride jest używana tylko wtedy, gdy właściwość CultureSource jest ustawiona na Override i jest ignorowana w przeciwnym razie. Określa kulturę liczb. Wartość null, wartość domyślna, jest interpretowana jako en-US.
Podstawienie:
Ta właściwość określa sposób zamiany liczb. Przyjmuje jedną z następujących wartości wyliczenia NumberSubstitutionMethod:
AsCulture: metoda podstawienia jest określana na podstawie właściwości NumberFormatInfo.DigitSubstitution kultury liczbowej. Jest to wartość domyślna.
Context: jeśli kultura liczbowa jest kulturą arabską lub perską, określa, że cyfry zależą od kontekstu.
European: Liczby są zawsze renderowane jako cyfry europejskie.
NativeNational: Liczby są renderowane przy użyciu cyfr narodowych dla danego formatu kultury liczbowej, zgodnie z NumberFormatdanej kultury.
Traditional: liczby są renderowane przy użyciu tradycyjnych cyfr dla kultury liczb. W przypadku większości kultur jest to samo co NativeNational. Jednak NativeNational powoduje cyfry łacińskie w niektórych kulturach arabskich, podczas gdy ta wartość skutkuje cyframi arabskimi we wszystkich kulturach arabskich.
Co oznaczają te wartości dla dewelopera zawartości dwukierunkowej? W większości przypadków deweloper może potrzebować tylko definiowania FlowDirection i języka każdego tekstowego elementu interfejsu użytkownika, na przykład Language="ar-SA", a logika NumberSubstitution zajmuje się wyświetlaniem liczb zgodnie z poprawnym interfejsem użytkownika. W poniższym przykładzie pokazano używanie arabskich i angielskich numerów w aplikacji Windows Presentation Foundation (WPF) działającej w arabskiej wersji systemu 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>
Poniższa ilustracja przedstawia dane wyjściowe poprzedniego przykładu, jeśli korzystasz z arabskiej wersji systemu Windows z wyświetlonymi numerami arabskimi i angielskimi:
W tym przypadku FlowDirection była ważna, ponieważ ustawienie FlowDirection na LeftToRight spowodowałoby uzyskanie cyfr europejskich. W poniższych sekcjach omówiono sposób ujednoliconego wyświetlania cyfr w całym dokumencie. Jeśli ten przykład nie jest uruchomiony w arabskim systemie Windows, wszystkie cyfry są wyświetlane jako cyfry europejskie.
Definiowanie reguł podstawiania
W rzeczywistej aplikacji może być konieczne programowe ustawienie języka. Na przykład chcesz ustawić atrybut xml:lang na taki sam jak atrybut używany przez interfejs użytkownika systemu, a może zmienić język w zależności od stanu aplikacji.
Jeśli chcesz wprowadzić zmiany na podstawie stanu aplikacji, skorzystaj z innych funkcji udostępnianych przez program Windows Presentation Foundation (WPF).
Najpierw ustaw NumberSubstitution.CultureSource="Text"składnika aplikacji. Użycie tego ustawienia zapewnia, że ustawienia nie pochodzą z interfejsu użytkownika dla elementów tekstowych, które mają wartość domyślną "Użytkownik", na przykład TextBlock.
Przykład:
<TextBlock
Name="text1" NumberSubstitution.CultureSource="Text">
1234+5679=6913
</TextBlock>
W odpowiednim kodzie języka C# ustaw właściwość Language, na przykład na wartość "ar-SA".
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage("ar-SA");
Jeśli musisz ustawić właściwość Language na język interfejsu użytkownika bieżącego użytkownika, użyj następującego kodu.
text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);
CultureInfo.CurrentCulture reprezentuje bieżącą kulturę używaną przez bieżący wątek w czasie wykonywania.
Ostateczny przykład XAML powinien być podobny do poniższego przykładu.
<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>
Ostatni przykład w języku C# powinien być podobny do poniższego.
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;
}
}
}
}
Poniższa ilustracja przedstawia wygląd okna dla dowolnego języka programowania z wyświetlonymi numerami arabskimi:
używanie właściwości podstawienia
Sposób, w jaki zastępowanie liczb działa w Windows Presentation Foundation (WPF), zależy zarówno od języka elementu tekstowego, jak i jego FlowDirection. Jeśli FlowDirection jest od lewej do prawej, są renderowane cyfry europejskie. Jednak jeśli jest poprzedzony tekstem arabskim lub ma język ustawiony na "ar", a FlowDirection jest RightToLeft, zamiast tego są renderowane cyfry arabskie.
W niektórych przypadkach można jednak utworzyć ujednoliconą aplikację, na przykład cyfry europejskie dla wszystkich użytkowników. Lub cyfry arabskie w komórkach Table z określonym Style. Jednym z prostych sposobów na to jest użycie właściwości Substitution.
W poniższym przykładzie pierwszy TextBlock nie ma ustawionej właściwości Substitution, dlatego algorytm wyświetla cyfry arabskie zgodnie z oczekiwaniami. Jednak w drugim TextBlockpodstawienie jest ustawione na europejskie, co zastępuje domyślną podstawę dla liczb arabskich, a wyświetlane są cyfry europejskie.
<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