WPF:句点字符(“.”)在 TextBlock 中的一个奇怪的地方

WPF: Period character (".") in a strange place in TextBlock

我在 WPF 中显示带有 TextBlock 的字符串。它有一个句点字符,后跟中间某处的换行符。由于某种原因,这会导致 TextBlock 始终在行首显示句点字符(它应该紧跟在单词 "content" 之后)。当我启用文本环绕时,它变得更加奇怪。现在通过调整 window 的大小,我可以将字符移动到不同的行,但它总是在开头。

这是我的标记:

<Grid Width="Auto">
    <Grid.Style>
        <Style TargetType="Grid">
            <Setter Property="Margin" Value="{StaticResource MessageBubbleMarginRight}" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Message.IsMine, ElementName=owner}" Value="True">
                    <Setter Property="Margin" Value="{StaticResource MessageBubbleMarginLeft}" />
                    <Setter Property="HorizontalAlignment" Value="Right" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>
    <Rectangle RadiusX="10" RadiusY="10" Stroke="Black" Fill="AliceBlue" />
    <TextBlock Text="{Binding ElementName=owner, Path=Message.Text, FallbackValue=This is a super long&#x0a;Multiline text}"
               Margin="20, 20, 20, 20"
               TextWrapping="Wrap"
               VerticalAlignment="Center">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="TextAlignment" Value="Right" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Message.IsMine, ElementName=owner}" Value="True">
                        <Setter Property="TextAlignment" Value="Left" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</Grid>

我是不是漏掉了什么?或者这是 WPF 中的渲染故障?

我刚刚找到了答案。我设法在设计器中重现该错误(请参阅第一个屏幕截图,句点放在 "long" 之后,然后是换行符)并意识到消息气泡位于 ItemsControlFlowDirection=RightToLeft 中。将其改回 LeftToRight 或在树的下方引入 LTR StackPanel 解决了该问题。 不过,我认为这是一个错误,因为流向不应更改文本流向(尤其是打乱某些字符的顺序),并将向开发团队报告。

编辑:显然这是预期的行为,因为 UI 元素应该继承 FlowDirection,包括 TextBlock,导致其将文本呈现为 RTL。解决方法就是在 TextBlock 中设置 FlowDirection=LeftToRight。有关详细信息,请参阅 https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/bidirectional-features-in-wpf-overview

为了以后参考,这是使用 .NET Core 3.0(无预览版)。此代码导致了问题,特别是第 2 行:

<ItemsControl ItemsSource="{Binding ElementName=owner, Path=Session.CurrentConversation.Value.Messages, FallbackValue=ABCDEFG}"
              FlowDirection="RightToLeft">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel LastChildFill="False" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <chat:ChatMessageTextBubble Message="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="DockPanel.Dock" Value="Bottom" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>