xamarin.forms - Xamarin Forms 标签不会在 WPF 平台上换行
问题描述
在我的 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 中,它只是将每个标签显示在一行上,如果不适合则将其截断:
我已经LineBreakMode="WordWrap"
在 XAML 中指定了,即使它是默认值,但文本仍然不换行。
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 构建,但均未成功。
解决方案
这里的罪魁祸首是<Frame>
元素。我通过简化您的示例代码、删除一个或另一个部分来确定这一点。<StackLayout>
直接放置在内部<ViewCell>
(没有干预<Frame>
)可以修复布局并使Label
文本按预期换行。
当然,如果你这样做,你也会失去标签周围漂亮的视觉边框。不用担心。我们可以绘制另一个边框并为其设置正确的大小和位置,使其看起来像包裹了您的内容。这里的技巧是使用 Grid 并将 the<Frame>
和 the<StackLayout>
放入 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 中都按预期换行,并且边框仍然显示。
推荐阅读
- bloomberg - 有没有人发现使用 Pdblp 或其他 Python 包调用 Bloomberg BQL API?
- c - C : getchar() 和 putchar()
- javascript - 运行重复的 javascript 获取请求会很快填满浏览器内存。有没有办法防止这种情况?
- python - python sqlite3 执行多个选择查询
- reactjs - 材料 UI 选择 onChange 在反应测试库中不起作用
- java - 为什么我的过滤器流返回具有“相同”元素名称的所有对象?
- c# - 如何使用 MSBuild.Extras 设置具有新 csproj 格式的 UWP 类库?
- vue.js - 自定义功能组件中的 VueJS Vee-validate
- actions-on-google - 内部 Google OAuth 库因帐户链接而崩溃
- typescript - TypeScript 中的条件参数类型