1

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

我正在做的就是这个

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

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

结果:Wpf 文本框将值显示为 1j2a,而 Win 表单文本框将其显示为 j2a1。

由于阿拉伯语是从右到左的,所以 Win 格式显示的值是正确的,而 WPF 显示的值是错误的。

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

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

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

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

4

2 回答 2

1

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

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

向右移动的字符串应该是这样,这也是您的阿拉伯语用户所期望的。

zh-CN 中的 Microsoft 主页

ar-iq 中的同一页面

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

如果您确定即使在FlowDirection反转时也要保持内容左对齐,Style.Trigger请相应地应用 a 来执行此操作,但请查看您的用户体验感觉。

<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>
于 2013-07-04T15:14:38.037 回答
0

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

在 Xaml 中

<TextBox Name="TxtBox1" FlowDirection="RightToLeft">
于 2013-07-04T14:42:40.977 回答