多个URL突出显示使用标签span- xamarin.forms



我有一个包含标签的xamarin.forms应用程序。标签文本有时包含网址。所以我正在尝试使用 span 突出显示 URL 并提供对它的单击。目前,仅当我的标签包含单个 URL 时,它才会亮起。我使用手动分配三个跨度来完成此操作。但是如何实现它以进行多个 URL 检测?例如:">嘿,检查一下这个www.stackoverflow.comwww.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);
}

您可以将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;
}
}

最新更新