C# 自定义标签中的Xamarin可单击子字符串

C# 自定义标签中的Xamarin可单击子字符串,c#,xamarin,xamarin.forms,xamarin.ios,xamarin.android,C#,Xamarin,Xamarin.forms,Xamarin.ios,Xamarin.android,我试图使用户可以单击标签中的某个子字符串并运行一个方法,例如,单击hashtag将运行OpenHashtagstring hashtag,单击@taggedUser将运行ViewProfiletaggedUser 我找到了教程,除了我不希望电话号码或URL是可点击的,只有标签和标签用户 这些是它使用的渲染 安卓 IOS 安卓: 而不是使用textView.AutoLinkMask=MatchOptions.All 你可以用 方法定义正则表达式,例如,任何以或@开头的单词都可以使用 但在iOS上,

我试图使用户可以单击标签中的某个子字符串并运行一个方法,例如,单击hashtag将运行OpenHashtagstring hashtag,单击@taggedUser将运行ViewProfiletaggedUser

我找到了教程,除了我不希望电话号码或URL是可点击的,只有标签和标签用户

这些是它使用的渲染

安卓

IOS

安卓:

而不是使用textView.AutoLinkMask=MatchOptions.All 你可以用 方法定义正则表达式,例如,任何以或@开头的单词都可以使用

但在iOS上,我认为更复杂。 在这里,我看到两种选择:

使用WebView。解析字符串并添加Android:

而不是使用textView.AutoLinkMask=MatchOptions.All 你可以用 方法定义正则表达式,例如,任何以或@开头的单词都可以使用

但在iOS上,我认为更复杂。 在这里,我看到两种选择:


使用WebView。至少就Andriod而言,解析您的字符串并添加您将无法使用这些解决方案。他们启用的andriod功能来自,显然它们不支持散列标签,您必须制作一个非常特定的渲染器,我猜这不会是微不足道的,但可能是可行的,或者找到一个预先制作的解决方案,您可以采用一种更细粒度的方法。最好的方法是在标签上添加一个手势识别器。我不太清楚您为什么选择自定义渲染器,但我看到您用xamarin.forms标记了这个问题。如果您已经用xamarin表单构建了解决方案,那么添加一个执行命令的手势识别器将是微不足道的。@Spokkruger如果我添加一个手势识别器,它将使整个标签仅指向该标签,如果一篇文章中有两个hashtag或两个带标签的用户呢?至少就Andriod而言,您将无法使用这些解决方案。他们启用的andriod功能来自,显然它们不支持散列标签,您必须制作一个非常特定的渲染器,我猜这不会是微不足道的,但可能是可行的,或者找到一个预先制作的解决方案,您可以采用一种更细粒度的方法。最好的方法是在标签上添加一个手势识别器。我不太清楚您为什么选择自定义渲染器,但我看到您用xamarin.forms标记了这个问题。如果您已经用xamarin表单构建了解决方案,那么添加一个执行命令的手势识别器将是微不足道的。@Spokkruger如果我添加一个手势识别器,它将使整个标签仅指向该标签,如果一篇文章中有两个hashtag或两个标记用户,该怎么办?单击时我如何告诉它运行哪个方法?单击时我如何告诉它运行哪个方法?
[assembly: ExportRenderer(typeof(BodyLabel), typeof(BodyLabelAndroid))]
namespace SocialNetwork.Droid.Renderers
{
    public class BodyLabelAndroid : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            var view = (BodyLabel)Element;
            if (view == null) return;

            TextView textView = new TextView(Forms.Context);
            textView.LayoutParameters = new LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
            textView.SetTextColor(view.TextColor.ToAndroid());

            // Setting the auto link mask to capture all types of link-able data
            textView.AutoLinkMask = MatchOptions.All;
            // Make sure to set text after setting the mask
            textView.Text = view.Text;
            textView.SetTextSize(ComplexUnitType.Dip, (float)view.FontSize);

            // overriding Xamarin Forms Label and replace with our native control
            SetNativeControl(textView);
        }
    }
}
[assembly: ExportRenderer(typeof(BodyLabel), typeof(BodyLabeliOS))]
namespace SocialNetwork.iOS.Renderers
{
    public class BodyLabeliOS : ViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<View> e)
        {
            base.OnElementChanged(e);

            var view = (AwesomeHyperLinkLabel)Element;
            if (view == null) return;

            UITextView uilabelleftside = new UITextView(new CGRect(0, 0, view.Width, view.Height));
            uilabelleftside.Text = view.Text;
            uilabelleftside.Font = UIFont.SystemFontOfSize((float)view.FontSize);
            uilabelleftside.Editable = false;

            uilabelleftside.DataDetectorTypes = UIDataDetectorType.All;
            uilabelleftside.BackgroundColor = UIColor.Clear;

            SetNativeControl(uilabelleftside);
        }
    }
}