我有一个自定义的渲染器在UITextView中显示HTML格式的文本。如果我将文本硬编码到包含控件的页面的构造函数中(因此它被设置在自定义控件的OnElementChanged事件中),它显示正常。如果我等待一个api调用来获取文本,然后设置它(所以它被设置在自定义控件的OnElementPropertyChanged事件中),它不会重绘。如果我更改设备的方向,则会显示文本。我需要添加什么才能让它在设置时显示文本?Xamarin Forms iOS CustomRenderer不重绘
[assembly: ExportRenderer(typeof(HtmlLabel), typeof(HtmlLabelRenderer))]
namespace MyApp.iOS.Renderers
{
class HtmlLabelRenderer : ViewRenderer<HtmlLabel, UITextView>
{
private UITextView _htmlTextView = new UITextView();
protected override void OnElementChanged(ElementChangedEventArgs<HtmlLabel> e)
{
base.OnElementChanged(e);
if (Element?.Text == null) return;
SetHtmlText(Element.Text);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (string.Equals(e.PropertyName, "Text", StringComparison.CurrentCultureIgnoreCase))
{
SetHtmlText(((HtmlLabel)sender).Text);
_htmlTextView.SetNeedsDisplay();
}
base.OnElementPropertyChanged(sender, e);
}
private void SetHtmlText(string text)
{
var attr = new NSAttributedStringDocumentAttributes {DocumentType = NSDocumentType.HTML};
var nsError = new NSError();
_htmlTextView.Editable = false;
_htmlTextView.AttributedText = new NSAttributedString(text, attr, ref nsError);
_htmlTextView.DataDetectorTypes = UIDataDetectorType.All;
SetNativeControl(_htmlTextView);
}
}
}
更新:现在
protected override void OnElementChanged(ElementChangedEventArgs<HtmlLabel> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null) return;
SetHtmlText(e.NewElement.Text ?? string.Empty);
SetNativeControl(_htmlTextView);
}
,如果我有一个以上的HtmlLabel页面上的所有除第一个显示:我得到了进一步通过改变OnElementChanged来。
我试过了,没有效果 – Christine
好 - 只是为了确认,是' 'HtmlLabel'上的Text属性是一个可绑定的属性?如果可以,可以发布'HtmlLabel'的代码。 – Ada
没有,是HtmlLabel无码 - 公共类HtmlLabel:标签 { } 我把它添加到页面 StackLayout> 然后在检索到代码后设置代码中的文本 HtmlDescription.Text = announcement.Details; –
Christine