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
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" 之后,然后是换行符)并意识到消息气泡位于 ItemsControl
和 FlowDirection=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>
我在 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
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" 之后,然后是换行符)并意识到消息气泡位于 ItemsControl
和 FlowDirection=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>