Xamarin Forms 标签不会在 WPF 平台上换行

Posted

技术标签:

【中文标题】Xamarin Forms 标签不会在 WPF 平台上换行【英文标题】:Xamarin Forms label does not wrap on WPF platform 【发布时间】:2020-10-11 03:41:13 【问题描述】:

在我的 Xamarin Forms 应用程序中,我有一个简单的 ListView,绑定到一个集合。每个集合项由我在标签中显示的两个字符串组成。字符串可能不适合一行,在这种情况下,它们应该换行并占用多行。

我将代码缩减到最低限度,以便在此处发布:

<ScrollView Orientation="Vertical">
    <ListView x:Name="lv" ItemsSource="Binding MessageItems" HasUnevenRows="True" Margin="10,10,30,10">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Frame VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" HasShadow="True" BorderColor="#0A2966" Margin="10,10,10,10">
                        <StackLayout Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
                            <Label x:Name="ShortText" LineBreakMode="NoWrap" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                                Short Text
                            </Label>
                            <Label x:Name="LongText" LineBreakMode="WordWrap" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Text="Binding MessageText">
                                This is a long message. It is so long it is going to wrap to the next line. It goes on and on and on to demonstrate word wrapping.
                            </Label>
                        </StackLayout>
                    </Frame>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ScrollView>

这一切都在 UWP 中按预期工作:

但在 WPF 中,它只是将每个标签显示在一行上,如果不适合则将文本截断:

我在 XAML 中指定了LineBreakMode="WordWrap",尽管它是默认值,但文本仍然不换行。

Xamarin 论坛中似乎有多个关于标签未包装的讨论,例如这个https://forums.xamarin.com/discussion/79278/word-wrap-on-label-doesnt-appear-to-be-working,但他们没有为我提供和回答。

Github 上有一个错误似乎准确地描述了我的问题 (https://github.com/xamarin/Xamarin.Forms/issues/3558),但它已被标记为已解决,并且该修复已在不久前合并。我认为它已经包含在最新版本的 Xamarin Forms 中,但我不确定如何检查。

我正在使用 Xamarin Forms 4.8.0.1534(最新版本),并且我还尝试了几种不同的 4.8.x 和 4.7.x 版本,但均未成功。

【问题讨论】:

Xamarin.Forms WPF 处于测试阶段。直到几周前我才知道它的存在。所有这些跨平台闪亮的新技术只有一个问题:它们有很多错误。 【参考方案1】:

这里的罪魁祸首是&lt;Frame&gt; 元素。我通过简化您的示例代码、删除一个或另一个部分来确定这一点。将&lt;StackLayout&gt; 直接放置在&lt;ViewCell&gt; 中(没有干预&lt;Frame&gt;)可以修复布局并使Label 文本按照应有的方式换行。

当然,如果你这样做,你也会失去标签周围漂亮的视觉边框。不用担心。我们可以绘制另一个边框并为其设置正确的大小和位置,使其看起来像是包裹了您的内容。这里的技巧是使用 Grid 并将 &lt;Frame&gt;&lt;StackLayout&gt; 放入 Grid 的第 0 行第 0 列。

经过以上两个改动,我们最终得到了这样的结果:

<ScrollView Orientation="Vertical">
    <ListView x:Name="lv" ItemsSource="Binding MessageItems" HasUnevenRows="True" Margin="10,10,30,10">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Margin="10,10,10,10">
                        <Frame VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" HasShadow="True" BorderColor="#0A2966"/>
                        <StackLayout Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Margin="20">
                            <Label x:Name="ShortText" LineBreakMode="NoWrap" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                                Short Text
                            </Label>
                            <Label x:Name="LongText" LineBreakMode="WordWrap" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Text="Binding MessageText">
                                This is a long message. It is so long it is going to wrap to the next line. It goes on and on and on.
                            </Label>
                        </StackLayout>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ScrollView>

现在标签在 WPF 和 UWP 中都按预期换行,并且边框仍然显示。

【讨论】:

谢谢!在我们的实际应用中尝试过这个,而不是简化的示例,它就像一个魅力。【参考方案2】:

XF WPF 仍处于 BETA ... 还有许多其他关于标签的问题,例如 spans fontsize ....

关于您的问题,我猜是 ListView 控件。它的开发已经停止,微软积极推荐CollectionViewBindableLayout

【讨论】:

谢谢你,法布里斯。我们使用 Xamarin Forms WPF 已经有一段时间了。这是一项成熟的技术,效果很好。 ListView 是一项更为成熟的技术,已在无数 XF 应用程序中使用。 好,很高兴听到这个消息,我从 Listview 开始工作;它从来没有以同样的方式出现两次(HasUnevenRows 设置为 true),ViewCell 没有正确调整大小......无论如何我不会阻止你,直到现在我还在使用 WPF :)

以上是关于Xamarin Forms 标签不会在 WPF 平台上换行的主要内容,如果未能解决你的问题,请参考以下文章

markdown WPFでXamarin.Formsをホストする

Prism for Xamarin Forms - 从标签页导航

开始使用 Xamarin.Forms.Platform.Avalonia

自定义控件的 Xamarin 数据绑定值计算为 Xamarin.Forms.Binding

Xamarin.Forms.Maps 如何像谷歌地图一样在图钉旁边/上方有一个标签?

我们可以在 xamarin.forms 中制作可滚动的底部标签页吗