【发布时间】:2019-05-12 13:10:36
【问题描述】:
我正在寻找一种方法,使 Xamarin Forms 中标签的部分文本可点击,执行不同的功能,并且理想情况下具有不同的格式。我知道可点击的标签很简单,可以这样做:
Label label = new Label { Text = "Click me" };
label.Click += () => { label.Text = "Clicked"; };
基本上,我希望模仿我在原生 Android 中完成的应用程序中的行为。我的应用程序必须适用于 Android 和 iOS,最好是 UWP。在 Android 中,可以将 CharSequence 对象添加到 TextView(类似于 Label 的控件)中。在 Android 中,我可能会像这样创建一个 CharSequence 对象:
Runnable doSomething; //equivalent to C# Action; assuming initialized somewhere
String myString = "My Clickable String"; //the clickable string
Spannable span = Spannable.Factory.getInstance().newSpannable(myString); //this is the clickable text to add to TextView
span.setSpan(new ClickableSpan() {
@Override
public void onClick(View v) {
doSomething.run(); //perform the action
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(true); //make underlined
ds.setColor(Color.rgb(color.r, color.g, color.b)); //change the color
ds.setFakeBoldText(true); //make it bold
ds.setTextSize((float) largeFont); //change the text size
}
}, 0, a.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //style and function for the entire string
如您所见,它执行一个功能并具有样式属性。然后我可以将它添加到 TextView(Spannable 实现 Spanned 实现 CharSequence)。除了不可点击的字符串之外,我还可以根据需要添加多个 CharSequence。
我希望有一种方法可以在 Xamarin 中执行此操作,但我还没有找到解决方案。我已经考虑过自定义渲染器的可能性,但如果可能的话,我觉得跨平台解决方案会更好。我对 iOS 不太熟悉,但似乎可以将 NSMutableAttributedString 对象添加到 UILabel 以达到类似的效果。我还看到了FancyLabel 对象。我不太确定如何为 UWP 做到这一点,因为我在研究中确实没有找到太多东西。
任何帮助将不胜感激!
【问题讨论】:
-
我也想弄清楚这一点。我最终放弃并使用
TapGestureRecognizer使整个标签可点击。宁愿只有特定的词可点击。 -
就我个人而言,我会创建自己的自定义控件(MyLabel : UILabel),然后我会添加两个公共整数,用于范围的开始和范围的结束。然后我会添加一个手势识别器并计算出字符串数组(label.text)中点击的索引,并添加您希望它执行的任何操作/事件。这是我头顶的一个粗略想法。
-
目前无法使用 X.Forms 标签。请参阅:forums.xamarin.com/discussion/26882/…。 Label 有一个 FormattedString 属性,但您只能更改文本的字体、大小和颜色,不能添加指向某些文本的链接。您需要使用自定义渲染器来使用特定于平台的方法在 TextView(Android)/UILabel(iOS) 中间添加链接。或者,您也许可以使用加载了本地 HTML 的 WebView?
标签: xamarin xamarin.forms