WPF의 양방향 기능 개요

다른 개발 플랫폼과 달리, WPF에는 왼쪽에서 오른쪽으로의 방향과 오른쪽에서 왼쪽으로의 방향이 혼합된 동일 문서와 같이 양방향 콘텐츠의 신속한 개발을 지원하는 많은 기능이 있습니다. 동시에 WPF는 아랍어와 히브리어 사용자와 같은 양방향 기능이 필요한 사용자를 위한 뛰어난 경험을 만듭니다.

다음 섹션에서는 최상의 양방향 콘텐츠 표시를 수행하는 방법을 보여주는 예제와 함께 다양한 양방향 기능을 설명합니다. C# 또는 Microsoft Visual Basic 코드에 손쉽게 개념을 적용할 수 있지만 대부분의 샘플은 XAML을 사용합니다.

FlowDirection

WPF의 콘텐츠 흐름 방향을 정의하는 기본 속성은 FlowDirection입니다. 이 속성은 두 열거형 값 LeftToRight 또는 RightToLeft 중 하나로 설정할 수 있습니다. 이 속성은 FrameworkElement에서 상속하는 모든 WPF 요소에 사용할 수 있습니다.

다음 예는 TextBox 요소의 흐름 방향을 설정합니다.

왼쪽에서 오른쪽 흐름 방향

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

오른쪽에서 왼쪽 흐름 방향

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

다음 그림에서는 이전 코드 렌더링 방법을 보여 줍니다.

다양한 흐름 방향을 보여주는 그래픽.

사용자 인터페이스(UI) 트리 내의 요소는 컨테이너에서 FlowDirection을 상속합니다. 다음 예제에서 TextBlockGrid 내에 있으며, 이는 Window에 상주합니다. FlowDirectionWindow에 대해 설정하면 GridTextBlock에 대해서도 설정하는 것이 됩니다.

다음은 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에는 RightToLeftFlowDirection이 있으므로 여기에 포함된 모든 요소는 동일한 FlowDirection을 상속합니다. 지정된 FlowDirection을 재정의하는 요소의 경우 이전 예제에서 LeftToRight로 변경한 두 번째 TextBlock 같은 명시적 방향 변경을 추가해야 합니다. FlowDirection이 정의되지 않은 경우 기본 LeftToRight를 적용합니다.

다음 그래픽은 이전 예제의 출력을 보여 줍니다.

명시적 흐름 방향 변경을 보여주는 그래픽.

FlowDocument

HTML, Win32 및 Java와 같은 여러 개발 플랫폼은 양방향 콘텐츠 개발에 대한 특별한 지원을 제공합니다. HTML과 같은 태그 언어는 콘텐츠 작성자에게 필요한 모든 방향으로 텍스트를 표시하는 데 필요한 태그를 제공합니다. 예를 들어 HTML 4.0 태그, "dir"은 값으로 "rtl" 또는 "ltr"를 사용합니다. 이 태그는 FlowDirection 속성과 비슷하지만 FlowDirection 속성은 더 발전된 방식으로 텍스트 내용의 레이아웃을 설정하며 텍스트가 아닌 콘텐츠에도 사용할 수 있습니다.

UI에서 이 속성은 텍스트, 표, 이미지, 기타 요소의 조합을 호스트할 수 있습니다. 다음 섹션의 샘플은 이 요소를 사용합니다.

FlowDocument에 텍스트를 더하는 방법은 한 가지 이상입니다. 간단한 방법은 Paragraph를 통하는 것으로, 텍스트 같은 콘텐츠를 그룹화하는 데 사용하는 블록 수준 요소입니다. 인라인 수준 요소에 텍스트를 더하기 위해 샘플에서는 SpanRun을 사용합니다. Span은 인라인 수준 흐름 콘텐츠 요소로, 다른 인라인 요소를 그룹화하는 데 사용되며 Run은 인라인 수준 흐름 콘텐츠 요소로 형식이 없는 텍스트의 실행을 포함하도록 만들어졌습니다. Span은 여러 Run 요소를 포함할 수 있습니다.

첫 번째 문서 예제는 \\server1\folder\file.ext 같은 여러 네트워크 공유 이름이 있는 문서를 포함합니다. 이 네트워크 링크가 아랍어나 영어 문서에 있는지 여부에 따라 같은 방식으로 항상 표시될 수 있습니다. 다음 그래픽은 Span 요소의 사용을 설명하며, 아랍어 RightToLeft 문서를 보여 줍니다.

Span 요소를 사용하여 설명하는 그래픽.

텍스트는 RightToLeft이기 때문에, "\"와 같은 모든 특수 문자는 오른쪽에서 왼쪽으로의 순서로 텍스트를 구분합니다. 그 결과 링크가 올바른 순서로 표시되지 않으므로 이 문제를 해결하려면 텍스트가 LeftToRight 흐름인 별도의 Run를 유지하도록 포함되어야 합니다. 언어마다 별도의 Run를 사용하는 대신 더 큰 규모의 아랍어 Span에 사용 빈도가 낮은 영어 텍스트를 포함하는 것이 이 문제를 해결하는 더 나은 방법입니다.

다음 그래픽은 Span 요소에 포함된 Run 요소를 사용하는 방식을 보여 줍니다.

Span 요소에 포함된 Run 요소를 보여주는 그래픽.

다음 예제는 문서에 RunSpan 요소를 사용하는 방법을 보여 줍니다.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    FlowDirection="RightToLeft">

  <FlowDocument>
    <Paragraph>
      <Span FlowDirection="RightToLeft" >
        ستجد الملف هنا:
        <Run FlowDirection="LeftToRight">
           \\server1\filename\filename1.txt</Run>
        ثم باقى النص!
      </Span>
    </Paragraph>
  </FlowDocument>
</Page>

Span 요소

Span 요소는 흐름 방향이 서로 다른 텍스트 사이에 경계 구분자로 작용합니다. 흐름 방향이 동일한 Span 요소도 양방향 범위가 서로 다른 것으로 간주되고, 이는 Span 요소의 순서가 컨테이너의 FlowDirection에 지정되어 있다는 의미이며, Span 요소 내의 콘텐츠만이 SpanFlowDirection을 따릅니다.

다음 그래픽은 여러 TextBlock 요소의 흐름 방향을 보여 줍니다.

다양한 흐름 방향이 있는 텍스트 블록을 보여주는 그래픽.

다음 예제는 SpanRun 요소를 사용하여 이전 그래픽에 표시된 결과를 생성하는 방법을 보여 줍니다.

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

샘플의 TextBlock 요소에서 Span 요소의 레이아웃은 부모의 FlowDirection에 따라 지정되지만 각 Span 요소의 텍스트 흐름은 자체 FlowDirection에 따릅니다. 라틴어와 아랍어 또는 다른 언어에 적용됩니다.

Xml:lang 추가

다음 그래픽은 "200.0+21.4=221.4"와 같은 숫자 및 산술 연산자를 사용하는 또 다른 예를 보여 줍니다. FlowDirection만 설정된다는 점에 유의하세요.

FlowDirection만을 사용하여 숫자를 표시하는 그래픽.

FlowDirection이 올바르더라도 아랍어 숫자로 표시되어야 하는 숫자가 표시되지 않으므로 사용자는 이 애플리케이션의 결과에 실망할 수 있습니다.

XAML 요소는 각 요소의 언어를 정의하는 XAML 특성(xml:lang)을 포함할 수 있습니다. 또한 XAML은 트리의 부모 요소에 적용된 xml:lang 값이 자식 요소에서 사용되는 XML 언어 원칙을 지원합니다. 이전 예제에서는 Run 요소 또는 해당 최상위 수준 요소에 언어가 정의되지 않기 때문에, 기본값 xml:lang이 사용되었으며 XAML의 경우 en-US입니다. Windows Presentation Foundation(WPF)의 내부 숫자 셰이핑 알고리즘은 해당 언어(이 경우, 영어)의 숫자를 선택합니다. 아랍어 숫자를 올바르게 렌더링하려면 xml:lang을 설정해야 합니다.

다음 그래픽에서는 xml:lang이 추가된 예제를 보여 줍니다.

오른쪽에서 왼쪽으로 진행되는 아라비아 숫자를 표시하는 그래픽.

다음 예제에서는 애플리케이션에 xml:lang을 추가합니다.

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

"ar-SA"와 같이 대상 지역에 따라 여러 언어는 다양한 xml:lang 값을 가지며 "ar-EG"는 아랍어의 두 변형을 나타냅니다. 이전 예제에서는 xml:langFlowDirection 값 모두를 정의해야 함을 보여 줍니다.

텍스트가 아닌 요소가 있는 FlowDirection

FlowDirection은 텍스트 요소의 텍스트 흐름 방식뿐만 아니라 거의 모든 다른 UI 요소의 흐름 방향을 정의합니다. 다음 그래픽은 가로 LinearGradientBrush를 사용하여 왼쪽에서 오른쪽 그라데이션으로 배경을 그리는 ToolBar를 보여 줍니다.

그라데이션이 왼쪽에서 오른쪽인 도구 모음을 표시하는 그래픽.

FlowDirectionRightToLeft로 설정한 후 ToolBar 단추가 오른쪽에서 왼쪽으로 정렬될 뿐 아니라 LinearGradientBrush도 오른쪽에서 왼쪽으로 흐르도록 오프셋을 재정렬합니다.

다음 그래픽은 LinearGradientBrush의 재정렬을 보여 줍니다.

그라데이션이 오른쪽에서 왼쪽인 도구 모음을 표시하는 그래픽.

다음 예제는 RightToLeftToolBar를 그립니다. (왼쪽에서 오른쪽으로 그리려면 ToolBar에서 FlowDirection 속성을 삭제합니다.)

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

FlowDirection이 예상대로 작동하지 않는 사례가 드물게 존재합니다. 이 섹션에서는 이러한 예외 중 두 가지를 설명합니다.

이미지

Image는 이미지를 표시하는 컨트롤을 나타냅니다. XAML에서 표시할 Image의 URI(Uniform Resource Identifier)를 정의하는 Source 속성과 함께 사용할 수 있습니다.

다른 UI 요소와 달리 Image는 컨테이너에서 FlowDirection을 상속하지 않습니다. 그러나 FlowDirection이 명시적으로 RightToLeft로 설정되어 있으면 Image가 가로로 대칭 이동하여 표시됩니다. 양방향 콘텐츠의 개발자에게 편리한 기능으로 구현됩니다. 경우에 따라 이미지를 가로로 대칭 이동하면 원하는 효과가 나타나기 때문입니다.

다음 그래픽은 대칭 이동한 Image를 보여 줍니다.

대칭 이동을 표시하는 그래픽.

다음 예제는 ImageFlowDirection을 포함한 StackPanel에서 이를 상속하지 못하는 경우를 보여 줍니다.

참고

ms_logo.jpg라는 파일이 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>

참고

다운로드 파일에 포함되는 파일은 ms_logo.jpg 파일입니다. 코드는 .jpg 파일이 프로젝트 내에 있지 않지만 C:\ 드라이브 어딘가에 있다고 가정합니다. 프로젝트 파일에서 C:\ 드라이브로 .jpg를 복사하거나 프로젝트 내부에서 파일을 찾도록 코드를 변경해야 합니다. 이를 수행하려면 Source="file://c:/ms_logo.jpg"Source="ms_logo.jpg"로 변경합니다.

경로

Image 외에 다른 흥미로운 요소는 Path입니다. 경로는 일련의 연결된 선 및 곡선을 그릴 수 있는 개체입니다. FlowDirection에 관한 Image와 유사한 방식으로 동작합니다. 예를 들어 RightToLeftFlowDirectionLeftToRight의 가로 거울상입니다. 그러나 Image와 달리 Path는 컨테이너에서 FlowDirection을 상속하며, 이를 명시적으로 지정할 필요는 없습니다.

다음 예제에서는 3개의 선을 사용하여 간단한 화살표를 그립니다. 첫 번째 화살표는 출발점과 종료점이 오른쪽의 루트에서 측정되도록 StackPanel에서 RightToLeft 흐름 방향을 상속합니다. 명시적 RightToLeftFlowDirection이 있는 두 번째 화살표도 오른쪽에서 시작합니다. 그러나 세 번째 화살표는 왼쪽에 시작 루트가 있습니다. 그리기에 관한 자세한 내용은 LineGeometryGeometryGroup을 참조하세요.

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

다음 그래픽은 Path 요소를 사용해 그린 화살표가 포함된 이전 예제의 출력을 보여 줍니다.

Path 요소를 사용하여 그린 화살표를 표시하는 그래픽.

ImagePath는 WPF가 FlowDirection을 사용하는 방법에 대한 두 가지 예입니다. 컨테이너 내의 특정 방향으로 UI 요소를 배치하는 것 외에도 FlowDirection은 표면에 잉크를 렌더링하는 InkPresenter, LinearGradientBrush, RadialGradientBrush와 같은 요소와 함께 사용할 수 있습니다. 왼쪽에서 오른쪽 동작을 모방하는 콘텐츠에 대해 오른쪽에서 왼쪽으로의, 또는 그 반대의 동작이 필요할 때마다 Windows Presentation Foundation(WPF)은 해당 기능을 제공합니다.

숫자 대체

지금까지 Windows는 서로 다른 로캘에서 통합된 이 숫자의 내부 스토리지를 유지하면서 동일한 숫자에 대한 다양한 문화권 도형 표시를 허용하여 숫자 대체를 지원해 왔습니다. 예를 들어 숫자는 잘 알려진 16진수 값, 0x40, 0x41로 저장되지만 선택한 언어에 따라 표시되었습니다.

이로 인해 애플리케이션은 다른 언어로 변환할 필요 없이 숫자 값을 처리할 수 있었습니다. 예를 들어, 사용자가 현지화된 아랍어 Windows에서 Microsoft Excel 스프레드시트를 열어 아랍어로 된 숫자를 볼 수 있지만 유럽 버전의 Windows에서 열어 동일한 숫자의 유럽 표시를 볼 수 있습니다. 보통 동일한 문서에서 숫자와 같이 표시되기 때문에 쉼표 구분 기호와 백분율 기호와 같은 다른 기호에도 필요합니다.

Windows Presentation Foundation(WPF)은 동일한 기능을 계속 유지하며 대체가 사용되는 시기와 방법을 사용자가 더 많이 제어할 수 있도록 이 기능에 대한 지원을 추가합니다. 이 기능은 모든 언어를 대상으로 하지만, 애플리케이션을 실행하는 다양한 문화권 때문에 특정 언어에 대한 숫자 모양을 애플리케이션 개발자가 지정하기 어려운 양방향 콘텐츠에서 더욱 유용합니다.

Windows Presentation Foundation(WPF)에서 숫자 대체가 작동하는 방식을 제어하는 핵심 속성은 Substitution 종속성 속성입니다. NumberSubstitution 클래스는 텍스트의 수가 표시되는 방식을 지정합니다. 동작을 정의하는 세 가지 공용 속성이 있습니다. 다음은 각 속성에 대한 요약입니다.

CultureSource:

이 속성은 숫자에 대한 문화권을 결정하는 방법을 지정합니다. 세 가지 NumberCultureSource 열거형 값 중 하나를 사용합니다.

CultureOverride:

CultureSource 속성이 Override로 설정될 경우에만 CultureOverride 속성이 사용되고 그렇지 않으면 무시됩니다. 숫자 문화권을 지정합니다. null의 값, 기본값은 en-US로 해석됩니다.

대체:

이 속성에는 수행할 숫자 대체의 형식을 지정합니다. 다음 NumberSubstitutionMethod 열거형 값 중 하나를 사용합니다.

  • AsCulture: 대체 방식은 숫자 문화권의 NumberFormatInfo.DigitSubstitution 속성에 따라 결정됩니다. 이것이 기본값입니다.

  • Context: 숫자 문화권이 아랍어 또는 페르시아어 문화권이면 컨텍스트에 따라 숫자가 결정되도록 지정합니다.

  • European: 숫자는 항상 유럽 숫자로 렌더링됩니다.

  • NativeNational: 문화권의 NumberFormat에 지정된 대로 숫자가 숫자 문화권에 대한 국가별 숫자를 사용하여 렌더링됩니다.

  • Traditional: 숫자가 숫자 문화권에 대한 전통 숫자를 사용하여 숫자가 렌더링됩니다. 대부분의 문화권에서 NativeNational과 같습니다. 그러나 NativeNational을 사용하면 일부 아랍어 문화권에 대해 라틴 숫자가 사용되는 반면 이 값을 사용하면 모든 아랍어 문화권에 대해 아랍어 숫자가 사용됩니다.

이 값은 양방향 콘텐츠 개발자에게 무슨 의미입니까? 대부분의 경우 개발자는 FlowDirection 및 각 텍스트 UI 요소의 언어만 정의하면 됩니다. 예를 들어 Language="ar-SA"NumberSubstitution 논리는 올바른 UI에 따라 숫자를 표시하는 역할을 담당합니다. 다음 예제는 아랍어 버전의 Windows에서 실행되는 Windows Presentation Foundation(WPF) 애플리케이션에서 아라비아 및 영어 숫자를 사용하는 모습을 보여 줍니다.

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

다음 그래픽은 아라비아 숫자와 영어 숫자가 표시된 아랍어 버전의 Windows을 실행 중인 경우 이전 샘플의 출력을 보여 줍니다.

아라비아 숫자 및 영숫자를 표시하는 그래픽.

유럽 숫자를 일시 중단하는 대신 FlowDirectionLeftToRight로 설정했으므로 이 경우에는 FlowDirection이 중요했습니다. 다음 섹션에서는 문서 전체에서 숫자를 단일하게 표시하는 방법을 설명합니다. 이 예제에서 아랍어 창을 실행하지 않는 경우 모든 숫자는 유럽 숫자로 표시됩니다.

대체 규칙 정의

실제 애플리케이션에서, 언어를 프로그래밍 방식으로 설정해야 합니다. 예를 들어, xml:lang 특성을 시스템의 UI에서 사용된 특성과 동일하게 설정하거나, 애플리케이션 상태에 따라 언어를 변경할 수 있습니다.

애플리케이션의 상태에 따라 변경하려는 경우, Windows Presentation Foundation(WPF)에서 제공된 다른 기능을 사용합니다.

먼저, 애플리케이션 구성 요소의 NumberSubstitution.CultureSource="Text"를 설정합니다. 이 설정을 사용하면 TextBlock 같이 "사용자"가 기본값인 텍스트 요소에 대해 UI의 설정이 사용되지 않습니다.

다음은 그 예입니다.

<TextBlock
   Name="text1" NumberSubstitution.CultureSource="Text">
   1234+5679=6913
</TextBlock>

해당 C# 코드에서 Language 속성을 예를 들어 "ar-SA"로 설정합니다.

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

Language 속성을 현재 사용자의 UI 언어로 설정해야 하는 경우, 다음 코드를 사용합니다.

text1.Language = System.Windows.Markup.XmlLanguage.GetLanguage(System.Globalization.CultureInfo.CurrentUICulture.IetfLanguageTag);

CultureInfo.CurrentCulture는 런타임의 현재 스레드에서 사용하는 현재 문화권을 나타냅니다.

최종 XAML 예제는 다음 예제와 유사해야 합니다.

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

최종 C# 예제는 다음과 유사해야 합니다.

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

다음 그래픽은 프로그래밍 언어 중 하나와 같은 모양의 창을 보여 주며, 아라비아 숫자를 표시합니다.

아라비아 숫자를 표시하는 그래픽.

대체 속성 사용

Windows Presentation Foundation(WPF)에서의 숫자 대체 작동 방식은 텍스트 요소와 해당 FlowDirection의 언어에 따라 달라집니다. FlowDirection이 왼쪽에서 오른쪽인 경우 유럽 숫자가 렌더링됩니다. 그러나 아랍어 텍스트가 우선 적용되거나 언어가 "ar"로 설정되고 FlowDirectionRightToLeft인 경우 아라비아 숫자가 대신 렌더링됩니다.

그러나 경우에 따라 모든 사용자에 대해 유럽 숫자 같이 단일하게 적용할 수 있습니다. 또는 특정 Style이 포함된 Table 셀의 아라비아 숫자가 적용됩니다. Substitution 속성을 사용하면 이 작업을 간단하게 수행할 수 있습니다.

다음 예제에서 첫 번째 TextBlock에는 Substitution 속성이 설정되어 있지 않으므로 알고리즘이 예상대로 아라비아 숫자를 표시합니다. 그러나 두 번째 TextBlock에서, 대체가 아랍어 숫자에 대한 기본값을 재정의하는 유럽으로 설정되고 유럽 숫자가 표시됩니다.

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