【问题标题】:Why won't my Xamarin.Forms label wrap text?为什么我的 Xamarin.Forms 标签不换行?
【发布时间】:2016-11-23 08:45:40
【问题描述】:

我正在尝试在 MasterDetail 页面的 Master 页面内制作标签包装。我认为这是包装标签的默认行为,但以防万一我什至制作了自定义渲染器。我已经确认自定义渲染器可以工作(通过调试并向标签添加背景),所以我认为我缺少一些简单的东西。谁能看看我的 xaml 并告诉我为什么这个标签没有换行?

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.Pages.NavigationDrawer.NavigationMenuMasterPage"
             xmlns:statics="clr-namespace:MyApp.Statics;assembly=MyApp"
             xmlns:multi="clr-namespace:MyApp.Pages.NavigationDrawer;assembly=MyApp"
             Title="Navigation drawer"
             Icon="hamburger.png"
             BackgroundColor="White">
    <ContentPage.Content>
        <StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="Center" Margin="0, 25, 0, 0">
            <StackLayout Orientation="Horizontal" HorizontalOptions="Center">
                <Image x:Name="connectionStatusImage" />
                <Label x:Name="connectionStatusText"  Margin="16, 0, 16, 0" YAlign="Center" FontSize="Medium"/>
            </StackLayout>
            <Label x:Name="changeConnectionStatusButton" TextColor="{x:Static statics:Palette.Orange}" XAlign="Center" FontAttributes="Bold" >
                <Label.GestureRecognizers>
                    <TapGestureRecognizer Tapped="ChangeConnectionStatusClicked" NumberOfTapsRequired="1" />
                </Label.GestureRecognizers>
            </Label>
            <StackLayout x:Name="SyncStatusStack" Orientation="Horizontal" Margin="0, 16, 16, 0" VerticalOptions="Center" >
                <multi:MultiLineLabel x:Name="syncStatusText" MinimumWidthRequest="0" Margin="16, 0, 0, 0" Text="I want to write a really long string to see if it wraps" />
                <Label x:Name="syncButton" MinimumWidthRequest="40" Text="SYNC" FontAttributes="Bold" YAlign="Center" HorizontalOptions="End" >
                    <Label.GestureRecognizers>
                        <TapGestureRecognizer x:Name="SyncGestureRecognizer" NumberOfTapsRequired="1" />
                    </Label.GestureRecognizers>
                </Label>
            </StackLayout>
            <StackLayout x:Name="SyncStack" Orientation="Vertical" HorizontalOptions="Center" Margin="0, 16, 0, 0">
                <ActivityIndicator x:Name="syncingIndicator"  Margin="16, 0, 32, 0"/>
                <Label x:Name="syncingText" />
            </StackLayout>
            <ListView x:Name="menuListView" VerticalOptions="FillAndExpand" SeparatorVisibility="None" Margin="0, 16, 0, 0">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextCell Text="{Binding Title}" TextColor="{x:Static statics:Palette.PrimaryText}" />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

还有我的(很可能是不必要的)自定义标签渲染器:

using MyApp.iOS.Renderers;
using MyApp.Pages.NavigationDrawer;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MultiLineLabel), typeof(MultiLineLabeliOSRenderer))]
namespace MyApp.iOS.Renderers
{
    public class MultiLineLabeliOSRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            if (Control == null) return;

            Control.LineBreakMode = UIKit.UILineBreakMode.WordWrap;
            Control.Lines = 0;            
        }
    }
}

【问题讨论】:

    标签: label uilabel xamarin.forms multiline


    【解决方案1】:

    嗯,不知道为什么,但你正确地将行设置为 0 并使用自动换行应该可以解决问题 (Multiple lines of text in UILabel)

    我最近还使用自定义渲染器 (http://depblog.weblogs.us/2016/06/27/xamarin-forms-multi-line-label-custom-renderer-gotcha/) 实现了这一点,并使用了一个数字来指示我想要的确切行数。 这被设置到 Lines 属性中,然后包装工作。

    【讨论】:

    • 我做了一些实验,将标签放在不同的位置,并将标签放在不同位置的水平 StackLayouts 内(即使在具有基本 ListView 的新页面上。)看起来像水平内的标签如果同一页面上有 ListView,StackLayout 将不会在 iOS 上换行。如果没有 ListView,一切都会按预期进行。这一切都在 Android 上运行良好。所以我假设这一定是一个错误。我对 Grid 有同样的行为。所以我只是稍微改变了布局并使 StackLayout 垂直。不完全是我想要的,但它有效:)
    • 最好在 BugZilla 上发布一个 repo,这样它就会被跟踪!
    • @JasonToms 是对的 - 我刚刚打了这个......真是浪费时间。如果你想保持你的布局,你可以修改 LineBreakMode。
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多