2

我正在尝试使用 WrapPanel 和两个 TextBlocks 将星号 (*) 附加到某些文本的左侧,允许文本换行,并强制文本右对齐。通过创建一个将 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 吗?如何?

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

4

2 回答 2

4

试试这个:

<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 站点向 Microsoft 提交错误)

于 2010-07-20T15:16:19.043 回答
3

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

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

两个 Run 元素位于同一行,因为标签边界之间的任何类型的空白都会导致两个运行之间出现空格。(正如 HTML 所做的那样。)

于 2010-07-20T17:04:21.780 回答