使用WPF WrapPanel包装和右对齐文本 - WPF Bug?

时间:2010-07-20 15:10:29

标签: wpf silverlight layout wrappanel

我正在尝试使用WrapPanel和两个TextBlocks将星号(*)附加到某些文本的左侧,允许文本换行,并强制文本右对齐。我已经通过创建一个WrapPanel成功地完成了这项工作,其中FlowDirection设置为RightToLeft并添加我的文本,然后是星号。但是,如果我使用的文本恰好在行尾有任何非字母数字字符,则会莫名其妙地强行到行的前面。我发现这种行为很奇怪。我认为它必须是WPF中的一个错误而不是预期的行为。

Text = Normal Text(Other Text)的示例:

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

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

示例代码:

<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我无论如何都满足了我的所有要求。不过,我发现这是一个有趣的问题。

2 个答案:

答案 0 :(得分: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 site

向Microsoft提交错误

答案 1 :(得分:3)

在.Net 4(WPF4)运行中是可绑定的,所以你可以尝试这样的事情:

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

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