Подсветка нескольких URL с использованием метки span-xamarin.forms - PullRequest
0 голосов
/ 18 января 2020

У меня есть приложение xamarin.forms, которое содержит ярлык. Текст метки иногда содержит URL-адреса. Поэтому я пытаюсь выделить URL-адрес, используя span, и нажать на него. В настоящее время он будет выделяться только в том случае, если мой ярлык содержит один URL-адрес. Я сделал это с помощью назначения трех диапазонов вручную. Но как реализовать это для обнаружения нескольких URL? Например: " Эй, проверьте это { ссылка } и www.forum.xamarin.com". В настоящее время первый URL-адрес будет только выделен. оценил.

Что я сделал

OnSendCommand = new Command(() =>
            {

                if (!string.IsNullOrEmpty(TextToSend))
                {

                    var urlStr = TextToSend;


                    int startIndex = 0, endIndex = 0;

                    string[] words = urlStr.Split(' ').ToArray();


                    foreach (string str in words)
                    {
                        if (IsUrl(str))
                        {
                            startIndex = urlStr.IndexOf(str);
                            endIndex = str.Length ;
                        }
                    }

                    if (startIndex != 0 || endIndex != 0)
                    {
                        var formattedString = new FormattedString();

                        Span span1 = new Span() { Text = urlStr.Substring(0, startIndex), TextColor = Color.White };

                        formattedString.Spans.Add(span1);

                        Span span2 = new Span() { Text = urlStr.Substring(startIndex, endIndex), TextColor = Color.LightSkyBlue, TextDecorations = TextDecorations.Underline, FontAttributes = FontAttributes.Italic };
                        span2.GestureRecognizers.Add(new TapGestureRecognizer()
                        {
                            NumberOfTapsRequired = 1,
                            Command = new Command(async () => {

                                await PopupNavigation.Instance.PushAsync(new WebViewPopup(span2.Text));
                            })
                        });

                        formattedString.Spans.Add(span2);

                         Span span3 = new Span() { Text = urlStr.Substring(startIndex+endIndex, urlStr.Length - (startIndex + endIndex)), TextColor = Color.White };
                        formattedString.Spans.Add(span3);
                        var message = new Message
                        {
                            Text = formattedString,
                            IsIncoming = false,
                            MessageDateTime = DateTime.Now
                        };
                        Messages.Add(message);
                        TextToSend = string.Empty;
                    }

                    else
                    {
                        var message = new Message
                        {
                            Text = urlStr.ToString(),
                            IsIncoming = false,
                            MessageDateTime = DateTime.Now
                        };
                        Messages.Add(message);
                        TextToSend = string.Empty;
                    }                
                }

            });



         private static bool IsUrl(string url)
        {
            string pattern = @"((https?|ftp|file)\://|www.)[A-Za-z0-9\.\-]+(/[A-Za-z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*";
            Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
            return reg.IsMatch(url);
        }

1 Ответ

1 голос
/ 18 января 2020

Вы можете установить formattedString как глобальное свойство класса (ViewModel или ContentPage)

FormattedString formattedString { get; set; }
    if (!string.IsNullOrEmpty(urlStr))
        {

            string[] words = urlStr.Split(' ').ToArray();

            formattedString = new FormattedString();

            foreach (string str in words)
            {
                if (IsUrl(str))
                {
                    Span span = new Span() { Text = str, TextColor = Color.Blue, TextDecorations = TextDecorations.Underline, FontAttributes = FontAttributes.Italic };
                    span.GestureRecognizers.Add(new TapGestureRecognizer()
                    {

                    });

                    formattedString.Spans.Add(span);

                }

                else
                {
                    Span span = new Span() { Text = str, TextColor = Color.Black };

                    formattedString.Spans.Add(span);
                }
            }

            if (formattedString.Spans.Count != 0)
            {
               // label.FormattedText = formattedString;
            }

            else
            {
              //  label.Text = urlStr;
            }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...