【发布时间】:2017-10-07 17:01:15
【问题描述】:
我有一个自定义渲染器来在 UITextView 中显示 HTML 格式的文本。如果我将文本硬编码到包含控件的页面的构造函数中(因此它被设置在自定义控件的 OnElementChanged 事件中),它显示得很好。如果我等待 api 调用以获取文本然后设置它(因此它在自定义控件的 OnElementPropertyChanged 事件中设置)它不会重新绘制。如果我更改设备的方向,则会出现文本。我需要添加什么才能让它在设置时显示文本?
[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);
}
}
}
更新:我通过将 OnElementChanged 更改为:
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,除了第一个显示。
【问题讨论】:
标签: ios xamarin.forms custom-renderer