【问题标题】:Using the WPF WrapPanel to Wrap and Right Align Text - WPF Bug?使用 WPF WrapPanel 换行和右对齐文本 - WPF 错误?
【发布时间】:2023-04-06 10:00:02
【问题描述】:

我正在尝试使用 WrapPanel 和两个 TextBlock 将星号 (*) 附加到某些文本的左侧,允许文本换行,并强制文本右对齐。我通过创建一个将 FlowDirection 设置为 RightToLeft 的 WrapPanel 并添加我的文本,后跟星号成功地做到了这一点。但是,如果我使用的文本恰好在行尾有任何非字母数字字符,它就会莫名其妙地被强制排在行首。我觉得这种行为很奇怪。我认为这一定是 WPF 中的错误,而不是预期的行为。

文本示例 = 普通文本(其他文本):

Expected:
* Normal Text (Other
               Text)
Actual:
* Normal Text (Other
               (Text

您可以随意使用以下示例代码为自己重新创建问题。只需将它放在一个高度和宽度 = 100 的窗口中,然后在文本框中键入“普通文本(其他文本)”。或者,将高度和宽度设置为您喜欢的任何值,并编写足够的文本以强制换行,然后在末尾添加标点符号。

示例代码:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBox Name="input" />
    <WrapPanel Grid.Row="2" FlowDirection="RightToLeft">
        <TextBlock Text="{Binding ElementName=input, Path=Text}" TextWrapping="Wrap"/>
        <TextBlock Text="*" Margin="0,0,3,0"/>
    </WrapPanel>
</Grid>

那么,我的问题。

  • 这是一个错误,还是有意为之?
  • 如果这是一个错误,我是否应该以某种方式将其提交给 Microsoft?怎么样?

自从开始这篇文章以来,我决定将两个 TextBlock 放在一个两列网格中。使用包含 TextBlock 的非星号配置为使用 Right TextAlignment 无论如何我都满足了我的所有要求。不过,我发现这是一个有趣的问题。

【问题讨论】:

    标签: wpf silverlight layout wrappanel


    【解决方案1】:

    试试这个:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBox Name="input" />
        <WrapPanel Grid.Row="2" HorizontalAlignment="Right" >
            <TextBlock Text="*" Margin="0,0,3,0"/>
            <TextBlock Text="{Binding ElementName=input, Path=Text}" TextWrapping="Wrap"/>
    
        </WrapPanel>
    </Grid>
    

    FlowDirection 用于支持从右到左阅读的语言。由于我不了解此类语言的规则,因此我不会假装理解您为什么会看到自己的身份,或者这是否是错误。也就是说,我知道更改 FlowDirection 不是处理右对齐从左到右语言的正确方法,您应该改用 Horizo​​ntalAlignment。

    (为了将来参考,您可以通过Connect site 向 Microsoft 提交错误)

    【讨论】:

    • 效果很好!就像我的 RightToLeft FlowDirection 这样复杂的逻辑经常出现的情况一样,有一种更简单的方法可以做到这一点。我比我描述的网格更喜欢它。我值得花时间向 Microsoft 报告这种奇怪行为吗?
    • @Drew 看起来像是预期的行为。正如我所说,我实际上对此一无所知,但通过谷歌搜索发现了这个链接:i18nguy.com/markup/right-to-left.html
    • 我不能说我真的理解将语言从左到右更改为从右到左的规则,但我相信这是有意的行为。干得好。
    【解决方案2】:

    在 .Net 4 (WPF4) 中,运行是可绑定的,因此您可以尝试以下方法:

    <TextBlock TextAlignment="Right" TextWrapping="Wrap">
        <Run Text="*" /><Run Text="{Binding ElementName=Input, Path=Text}" />
    </TextBlock>
    

    两个 Run 元素位于同一行,因为标签边界之间的任何类型的空格都会导致两个 run 之间出现空格。 (就像 HTML 一样。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-07
      • 2010-12-02
      • 2010-10-30
      • 2013-08-23
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多