У меня есть приложение 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);
}