Элемент-шаблон CollectionView с большим количеством текста

#c# #xaml #xamarin

#c# #xaml #xamarin

Вопрос:

Для отображения некоторого текста и изображения я использую следующий элемент Collectionview ItemTemplate. К сожалению, элементы с большим количеством текста внутри Message свойства будут переполнять шаблон. Результат выглядит так, как показано на рисунке ниже. введите описание изображения здесь

                             <CollectionView.ItemTemplate>
                                <DataTemplate>
                                    <ContentView BackgroundColor="{DynamicResource ColorPrimary}">
                                        <custom:CustomFrame VerticalOptions="StartAndExpand"
                                                Style="{DynamicResource FrameWithShadowUnderline}">
                                            <AbsoluteLayout>
                                                <StackLayout                                        
                                                        AbsoluteLayout.LayoutFlags="SizeProportional"  
                                                        AbsoluteLayout.LayoutBounds=".0,.0,1,1"
                                                        Padding="0"
                                                        VerticalOptions="StartAndExpand">
                                                    <Grid Padding="2" VerticalOptions="StartAndExpand">
                                                        <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="0.25*"/>
                                                            <ColumnDefinition Width="*"/>
                                                        </Grid.ColumnDefinitions>
                                                        <Grid.RowDefinitions>
                                                            <RowDefinition Height="Auto"/>
                                                        </Grid.RowDefinitions>
                                                        <StackLayout Padding="1" Grid.Column="0">
                                                            <templates:DisplayCircleImageTemplate .../>
                                                        </StackLayout>

                                                        <StackLayout Grid.Column="1"
                                                                     Grid.Row="0"
                                                                     VerticalOptions="StartAndExpand">
                                                            <Label Text="{Binding MessageHeader}" FontAttributes="Bold" FontSize="Small"/>
                                                            <Label HorizontalTextAlignment="Start" 
                                                                    VerticalTextAlignment="Start"
                                                                    VerticalOptions="StartAndExpand"
                                                                    Style="{DynamicResource LabelGeneralText}"                                                               
                                                                    Text="{Binding Message}"/>

                                                        </StackLayout>

                                                    </Grid>
                                                    <custom:CustomFrame HasShadow="True" 
                                                                        Padding="0" 
                                                                        HorizontalOptions="Center">
                                                        <Image IsVisible="{Binding HasImage}"
                                                           HorizontalOptions="Center"
                                                            Source="{Binding ImageSource}"/>

                                                        <custom:CustomFrame.GestureRecognizers>
                                                            <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding Path=BindingContext.CloserLookCommand, Source={x:Reference stableInformation}}"
                                                                            CommandParameter="{Binding .}" />
                                                        </custom:CustomFrame.GestureRecognizers>
                                                    </custom:CustomFrame>
                                                    <StackLayout HorizontalOptions="End">
                                                        <Label  Text="{Binding SendDate, StringFormat='{0:d/M/yyyy}'}"  Style="{DynamicResource LabelGeneralText}"/>
                                                    </StackLayout>
                                                </StackLayout>
                                            </AbsoluteLayout>
                                        </custom:CustomFrame>
                                    </ContentView>
                                </DataTemplate>
                            </CollectionView.ItemTemplate>
 

T

Есть ли способ избежать этого переполнения текста?

Комментарии:

1. Привет, вы могли бы объяснить желаемый эффект, если Label сначала длина содержимого строки превышает содержимое. Например, автоматически устанавливается высота метки или заменяется содержимое переполнения ... . Потому что, если вы не контролируете размер строки, она рано или поздно переполнится.

Ответ №1:

Не супер framilair с Xamarin, но вы можете попробовать это, чтобы сократить текст вашего сообщения привязки (lineBreakMode =»TailTruncation»).

 <Label 
  Text="This is a very long text" 
  LineBreakMode="TailTruncation"
  WidthRequest="50">
</Label>
 

Отсюда: https://forums.xamarin.com/discussion/20509/truncate-long-texts-with-ellipsis-on-label-control

Комментарии:

1. Спасибо @Rob Smitha, я не знал о LineBreakMode ! Но это не смогло решить проблему.

Ответ №2:

Спасибо за ваши предложения, я обязательно буду использовать lineBreakMode в будущем!

Я смог решить вопрос, удалив AbsoluteLayout и заменив его на a GridLayout .

введите описание изображения здесь

                                     <ContentView BackgroundColor="{DynamicResource ColorPrimary}">
                                        <custom:CustomFrame VerticalOptions="StartAndExpand"
                                                Style="{DynamicResource FrameWithShadowUnderline}">
                                            <StackLayout Padding="0"
                                                        VerticalOptions="StartAndExpand">
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="0.25*"/>
                                                        <ColumnDefinition Width="*"/>
                                                    </Grid.ColumnDefinitions>
                                                    <Grid.RowDefinitions>
                                                        <RowDefinition Height="Auto"/>
                                                        <RowDefinition Height="Auto"/>
                                                        <RowDefinition Height="*"/>
                                                    </Grid.RowDefinitions>

                                                    <Grid Grid.Column="0" Grid.Row="0">
                                                        <StackLayout Padding="1">
                                                            <templates:DisplayCircleImageTemplate
                                                                CircleBackgroundColor="{DynamicResource ColorPrimary}"
                                                                ImageSource="{Binding Stable.Image}" 
                                                                ImageBorderThickness="1.2"
                                                                FrameBorderColor="{DynamicResource ColorPrimary}"
                                                                ImageBackgroundColor="{DynamicResource ColorPrimary}"
                                                                ImageBorderColor="{DynamicResource ButtonColor}"
                                                                HeightWidthOuterImage="{DynamicResource ProfileImageSize}"
                                                                CornerRadiusOuterImage="{DynamicResource ProfileImageSizeRadius}"
                                                                HeightWidthInnerImage="{DynamicResource ProfileImageSizeInsideSize}"/>
                                                        </StackLayout>
                                                    </Grid>

                                                    <Grid Grid.Column="1" Grid.Row="0">
                                                        <StackLayout>
                                                            <Label Text="{Binding MessageHeader}" 
                                                                   FontAttributes="Bold" 
                                                                   FontSize="Small"/>
                                                            <Label HorizontalTextAlignment="Start" 
                                                                    VerticalTextAlignment="Start"
                                                                    VerticalOptions="StartAndExpand"
                                                                    Style="{DynamicResource LabelGeneralText}"
                                                                    Text="{Binding Message}"/>
                                                        </StackLayout>
                                                    </Grid>
                                                    <custom:CustomFrame Grid.Row="1"
                                                                        Grid.ColumnSpan="2"
                                                                        HasShadow="True" 
                                                                        Padding="0" 
                                                                        HorizontalOptions="Center"
                                                                        IsVisible="{Binding HasImage}">
                                                        <Image IsVisible="{Binding HasImage}"
                                                           HorizontalOptions="CenterAndExpand"
                                                            Source="{Binding ImageSource}"/>

                                                        <custom:CustomFrame.GestureRecognizers>
                                                            <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding Path=BindingContext.CloserLookCommand, Source={x:Reference stableInformation}}"
                                                                            CommandParameter="{Binding .}" />
                                                        </custom:CustomFrame.GestureRecognizers>
                                                    </custom:CustomFrame>

                                                    <Label  Grid.Row="2" Grid.ColumnSpan="2"  Text="{Binding SendDate, StringFormat='{0:d/M/yyyy}'}"  
                                                                Style="{DynamicResource LabelGeneralText}"
                                                                HorizontalOptions="EndAndExpand"
                                                                VerticalOptions="EndAndExpand"/>
                                                </Grid>
                                            </StackLayout>
                                        </custom:CustomFrame>
                                    </ContentView>
 

Комментарии:

1. Привет, рад, что решил это! Не забудьте отметить ответ, когда у вас будет время, это поможет другим, у кого есть подобная проблема.