Создание представления Xamarin.Forms, которое показывает абзац, где каждое предложение кликабельно - PullRequest
0 голосов
/ 13 января 2020

У меня есть требование создать представление на Xamarin.Forms, которое отображает массив строк в абзаце. Каждое предложение должно быть:
1. Свободно текущим одно за другим в той же строке
2. Кликабельно , чтобы его можно было перемещать при нажатии

Также желательно выровнять такой параграф justify.

Вот предполагаемый каркас требования. Я выделил каждую строку чередующимися цветами, чтобы проиллюстрировать, как список строк (предложений) должен входить в свободно текущий абзац

Поскольку я новичок в Xamarin и все еще изучаю основы, мне нужна помощь в разработке этого просмотр с соответствующими представлениями / средствами управления.

1 Ответ

1 голос
/ 13 января 2020
  1. Свободно текущие один за другим в одной и той же строке
  2. Кликабельны, чтобы их можно было перемещать при нажатии

Мы могли бы их реализовать используя Span. Ярлыки предоставляют свойство FormattedText, которое позволяет отображать текст с несколькими шрифтами и цветами в одной и той же метке.

в xaml

<StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
   <!-- Place new controls here -->
   <Label
         x:Name="label"
         VerticalTextAlignment="Center"
         HorizontalTextAlignment="Center"
         HorizontalOptions="Center"
         VerticalOptions="CenterAndExpand" />
</StackLayout>

в коде

var formattedString = new FormattedString();

Span span1 = new Span() { Text = "Note that a Span can also respond to any gestures that are added to the span's GestureRecognizers collection .", BackgroundColor = Color.Red,FontSize=20};
span1.GestureRecognizers.Add(new TapGestureRecognizer {NumberOfTapsRequired=1, Command = new Command( ()=> {  // will been invoked when you click it , do some thing you want  } ) });

formattedString.Spans.Add(span1);

Span span2 = new Span() { Text = "Note that a Span can also respond to any gestures that are added to the span's GestureRecognizers collection .", BackgroundColor = Color.Gray, FontSize = 20};
span2.GestureRecognizers.Add(new TapGestureRecognizer { NumberOfTapsRequired = 1, Command = new Command(() => { // will been invoked when you click it , do some thing you want  }) });

formattedString.Spans.Add(span2);

Span span3 = new Span() { Text = "Note that a Span can also respond to any gestures that are added to the span's GestureRecognizers collection .", BackgroundColor = Color.Red, FontSize = 20};
span3.GestureRecognizers.Add(new TapGestureRecognizer { NumberOfTapsRequired = 1, Command = new Command(() => { // will been invoked when you click it , do some thing you want}) });

formattedString.Spans.Add(span3);

label.FormattedText = formattedString;

Для получения более подробной информации о Span вы можете проверить это документы .

Кроме того, желательно выровнять такой абзац выравнивания.

Мы могли бы использовать Пользовательский рендерер .

Примечание: JustificationMode доступно только после Android 8.0.

в вашем android проекте

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

using xxx.Droid;

[assembly:ExportRenderer( typeof(Xamarin.Forms.Label),typeof(MyLabelRenderer)) ]

namespace xxx.Droid
{
    public class MyLabelRenderer : LabelRenderer
    {
        public MyLabelRenderer(Context context) : base(context)
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            if(Control!=null)
            {
                if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
                {
                    Control.JustificationMode = Android.Text.JustificationMode.InterWord;
                }
            }

        }
    }
}

enter image description here

...