WPF Textbox流向问题与阿拉伯语

时间:2013-07-04 14:09:13

标签: wpf winforms arabic

我正在开发一个支持多种语言(包括阿拉伯语)的应用程序。我在输入值时在WPF文本框中观察到奇怪的行为,但奇怪的是,在Windows窗体文本框中工作正常。

我正在做的就是这个

  1. 创建一个文本框并将其流向保持为默认值LeftToRight
  2. 将应用程序的语言更改为阿拉伯语。
  3. 在文本框中逐个输入以下字母    1    一个    2    Ĵ

    (其中a和j表示任意两个阿拉伯字符)。

  4. 结果: Wpf文本框将值显示为1j2a Win表单文本框显示为j2a1。

    由于阿拉伯语是从右到左,因此Win表单显示的值是正确的,但WPF的值是错误的。

    如果我们将第一个字符键入为阿拉伯语,然后输入任何非阿拉伯字符,Wpf将显示正确的值。

    另外,如果我将TextBox的FlowDirection设置为RightToLeft,那么WPF文本框工作正常。但这会使我的字符串向右移动,应用程序将出现对齐问题。

    有没有人知道为什么WPF文本框在Windows窗体工作正常时显示不正确的值?

    另外,如果我们将流向设置为RightToLeft,我们可以保持文本对齐吗?

2 个答案:

答案 0 :(得分:0)

如果你使文本框flowdirection =" RightToLeft"

在Xaml

<TextBox Name="TxtBox1" FlowDirection="RightToLeft">

答案 1 :(得分:0)

  

另外,如果我将TextBox的FlowDirection设置为RightToLeft,那么WPF文本框工作正常。但这会使我的字符串向右移动,应用程序将出现对齐问题。

有点说你遇到的问题比基本对齐更大。 FlowDirection的重点是允许那些非本地LeftToRight读者在您的应用程序中使用本机UX。

向右移动的字符串应该是它应该是什么,这就是您的阿拉伯用户期望的。

Microsoft Home Page in en-US

Same page in ar-iq

有一个原因,不仅字符看起来不同,而且实际的文本流也是如此(这是该语言的用户所期望的)

如果您确定要将内容保持对齐,即使FlowDirection被撤消,请应用Style.Trigger进行相应操作,但请查看您的用户体验感受。

<TextBox>
  <TextBox.Style>
    <Style TargetType="{x:Type TextBox}">
      <Setter Property="HorizontalContentAlignment"
              Value="Left" />
      <Style.Triggers>
        <Trigger Property="FlowDirection"
                  Value="RightToLeft">
          <!-- "Right" - HorizontalContentAlignment with FlowDirection="RightToLeft" is
               the same end render visually as "Left" - HorizontalContentAlignment with
               FlowDirection="LeftToRight" -->
          <Setter Property="HorizontalContentAlignment"
                  Value="Right" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </TextBox.Style>
</TextBox>

<强>更新

由于OP现在声明控件实际上是TextBlock上面的Style看起来像:

<TextBlock>
  <TextBlock.Style>
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="TextAlignment"
              Value="Left" />
      <Style.Triggers>
        <Trigger Property="FlowDirection"
                  Value="RightToLeft">
          <Setter Property="TextAlignment"
                  Value="Right" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>