自动缩放标签Xamarin

时间:2019-04-12 04:47:58

标签: xamarin font-size autosize stacklayout

我正在开发一个显示RSS源结果的应用程序。我正在尝试在Stacklayout的同一行中显示标题和日期。

Xaml代码:

StackLayout>
    <Label Text="60 Second Sports" FontAttributes="Bold" HorizontalOptions="Center"/>
    <ListView x:Name="mainArticleRssList" IsPullToRefreshEnabled="True" Refreshing="ListItems_Refreshing" ItemTapped="RssList_ItemTapped">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="15,0,15,0">
                        <Label Text="{Binding Title}" 
                               LineBreakMode="WordWrap"
                               MaxLines="2"/>
                        <Label Text="{Binding PublishedDate}" 
                               LineBreakMode="WordWrap"
                               MaxLines="1"/>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <controls:AdMobView />
</StackLayout>

这是它的样子: enter image description here

我期望的是

我希望标题自动缩放以适合日期所在的行。是否可以设置整个行的宽度,然后将两个标签放入行内?


几个小时的谷歌搜索结果:

这里是我找到的一些链接,但是有些链接比较旧,不确定它们是否有效。
这个是旧的Auto Scale Text Size
这个没有用Auto-scaling label fontsize in Xamarin

我还找到了几个Nuget软件包,但我认为我不需要这样做。 https://baskren.github.io/Forms9Patch/ https://forums.xamarin.com/discussion/43468/autosize-font-label

2 个答案:

答案 0 :(得分:1)

您是否需要此屏幕截图?

enter image description here

您可以使用Grid来实现。

 <ContentPage.Content>
       <StackLayout>
          <Label Text="Xamarin.Forms native cell" HorizontalTextAlignment="Center" />
           <ListView x:Name="listView" CachingStrategy="RecycleElement" 
        ItemSelected="OnItemSelected">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>

                        <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />

                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="3*" />
                            <ColumnDefinition Width="1*" />
                            </Grid.ColumnDefinitions>

                            <Label Text="{Binding Title}" Grid.Row="0" Grid.Column="0" 
                           LineBreakMode="TailTruncation"
                           MaxLines="2" />
                            <Label Text="{Binding PublishedDate}" Grid.Row="0" Grid.Column="1" 
                           LineBreakMode="WordWrap"
                           MaxLines="1"/>
                        </Grid>
                    </ViewCell>


                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

如果标题太长,可以设置LineBreakMode="TailTruncation",当标签到达容器末端时它将自动截断。

答案 1 :(得分:0)

使用堆栈布局内部的网格布局来实现它

<ListView x:Name="mainArticleRssList" IsPullToRefreshEnabled="True" HasUnevenRows="True" Refreshing="ListItems_Refreshing" ItemTapped="RssList_ItemTapped">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="15,0,15,0">
                     <Grid x:Name="grd">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="7*"/>
                                    <ColumnDefinition Width="3*"/>
                                    </Grid.ColumnDefinitions>
                        <Label Text="{Binding Title}" 
                               LineBreakMode="WordWrap"
                               MaxLines="2"/>
                        <Label Text="{Binding PublishedDate}" Grid.Column="1"
                               LineBreakMode="WordWrap"
                               MaxLines="1"/>
                </Grid>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

使用此代码,它将对您有用。

相关问题