有没有办法将HTML添加到Xamarin.Forms页面?

有没有办法将HTML添加到Xamarin.Forms页面?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我希望能够在Xamarin.Forms页面中添加一些HTML?这可能吗?也可以将其添加为标签的一部分吗?如果您想要全面的html支持,那么Xamarin formsWebView将是一个不错的选择。但是,如果您想在Label中获得一些基本的格式支持,因为它是本机计数器部件(TextView在android中,以及UILabel在iOS中),您可以为此实现渲染器 表单控件 public class HtmlLabel : Label { public static readonly Bin

我希望能够在Xamarin.Forms页面中添加一些HTML?这可能吗?也可以将其添加为标签的一部分吗?

如果您想要全面的html支持,那么Xamarin forms
WebView
将是一个不错的选择。但是,如果您想在
Label
中获得一些基本的格式支持,因为它是本机计数器部件(
TextView
在android中,以及
UILabel
在iOS中),您可以为此实现渲染器

表单控件

public class HtmlLabel : Label
{
    public static readonly BindableProperty HtmlProperty =
        BindableProperty.Create(
            "Html", typeof(string), typeof(HtmlLabel),
            defaultValue: default(string));

    public string Html
    {
        get { return (string)GetValue(HtmlProperty); }
        set { SetValue(HtmlProperty, value); }
    }
}
iOS渲染器

[assembly: ExportRenderer(typeof(HtmlLabel), typeof(HtmlLabelRenderer))]
namespace HtmlLabelApp.iOS
{
    public class HtmlLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            //if we have a new forms element, we want to update text with font style (as specified in forms-pcl) on native control
            if (e.NewElement != null)
                UpdateTextOnControl();
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            //if there is change in text or font-style, trigger update to redraw control
            if (e.PropertyName == nameof(HtmlLabel.Html))
            {
                UpdateTextOnControl();
            }
        }

        void UpdateTextOnControl()
        {
            if (Control == null)
                return;

            if (Element is HtmlLabel formsElement)
            {
                //set new text with ui-style-attributes to native control (UILabel)
                var htmlString = new NSString(formsElement.Html ?? string.Empty);
                var htmlData = htmlString.Encode(NSStringEncoding.UTF8);
                var attr = new NSAttributedStringDocumentAttributes
                {
                    DocumentType = NSDocumentType.HTML
                };

                var error = new NSError();
                var dict = new NSDictionary();

                var attributedString = new NSAttributedString(htmlData, attr, out dict, ref error);
                Control.AttributedText = attributedString;
            }
        }
    }
}
[assembly: ExportRenderer(typeof(HtmlLabel), typeof(HtmlLabelRenderer))]
namespace HtmlLabelApp.Droid
{
    public class HtmlLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            //if we have a new forms element, we want to update text with font style (as specified in forms-pcl) on native control
            if (e.NewElement != null)
                UpdateTextOnControl();
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            //if there is change in text or font-style, trigger update to redraw control
            if (e.PropertyName == nameof(HtmlLabel.Html))
            {
                UpdateTextOnControl();
            }
        }

        void UpdateTextOnControl()
        {
            if (Control == null)
                return;

            if (Element is HtmlLabel formsElement)
            {
                var htmlAsString = formsElement.Html ?? string.Empty;      // used by WebView
                var htmlAsSpanned = Html.FromHtml(htmlAsString, FromHtmlOptions.ModeCompact); // used by TextView

                Control.TextFormatted = htmlAsSpanned;
            }
        }
    }
}
[程序集:ExportRenderer(typeof(HtmlLabel),typeof(HtmlLabelRenderer))]
名称空间HtmlLabelApp.iOS
{
公共类HtmlLabelRenderer:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
//如果我们有一个新的forms元素,我们希望在本机控件上使用字体样式(如forms pcl中指定的)更新文本
if(例如NewElement!=null)
UpdateTextOnControl();
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
//如果文本或字体样式发生更改,则触发对重画控件的更新
if(e.PropertyName==nameof(HtmlLabel.Html))
{
UpdateTextOnControl();
}
}
作废UpdateTextOnControl()
{
if(Control==null)
返回;
if(元素为HtmlLabel formsElement)
{
//将具有ui样式属性的新文本设置为本机控件(UILabel)
var htmlString=new NSString(formsElement.Html??string.Empty);
var htmlData=htmlString.Encode(NSStringEncoding.UTF8);
var attr=新的NSAttributed StringDocumentAttribute
{
DocumentType=NSDocumentType.HTML
};
var error=new NSError();
var dict=new NSDictionary();
var attributedString=新NSAttributedString(htmlData、attr、out dict、ref错误);
Control.AttributedText=attributedString;
}
}
}
}
Android渲染器

[assembly: ExportRenderer(typeof(HtmlLabel), typeof(HtmlLabelRenderer))]
namespace HtmlLabelApp.iOS
{
    public class HtmlLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            //if we have a new forms element, we want to update text with font style (as specified in forms-pcl) on native control
            if (e.NewElement != null)
                UpdateTextOnControl();
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            //if there is change in text or font-style, trigger update to redraw control
            if (e.PropertyName == nameof(HtmlLabel.Html))
            {
                UpdateTextOnControl();
            }
        }

        void UpdateTextOnControl()
        {
            if (Control == null)
                return;

            if (Element is HtmlLabel formsElement)
            {
                //set new text with ui-style-attributes to native control (UILabel)
                var htmlString = new NSString(formsElement.Html ?? string.Empty);
                var htmlData = htmlString.Encode(NSStringEncoding.UTF8);
                var attr = new NSAttributedStringDocumentAttributes
                {
                    DocumentType = NSDocumentType.HTML
                };

                var error = new NSError();
                var dict = new NSDictionary();

                var attributedString = new NSAttributedString(htmlData, attr, out dict, ref error);
                Control.AttributedText = attributedString;
            }
        }
    }
}
[assembly: ExportRenderer(typeof(HtmlLabel), typeof(HtmlLabelRenderer))]
namespace HtmlLabelApp.Droid
{
    public class HtmlLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            //if we have a new forms element, we want to update text with font style (as specified in forms-pcl) on native control
            if (e.NewElement != null)
                UpdateTextOnControl();
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            //if there is change in text or font-style, trigger update to redraw control
            if (e.PropertyName == nameof(HtmlLabel.Html))
            {
                UpdateTextOnControl();
            }
        }

        void UpdateTextOnControl()
        {
            if (Control == null)
                return;

            if (Element is HtmlLabel formsElement)
            {
                var htmlAsString = formsElement.Html ?? string.Empty;      // used by WebView
                var htmlAsSpanned = Html.FromHtml(htmlAsString, FromHtmlOptions.ModeCompact); // used by TextView

                Control.TextFormatted = htmlAsSpanned;
            }
        }
    }
}
[程序集:ExportRenderer(typeof(HtmlLabel),typeof(HtmlLabelRenderer))]
名称空间HtmlLabelApp.Droid
{
公共类HtmlLabelRenderer:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
//如果我们有一个新的forms元素,我们希望在本机控件上使用字体样式(如forms pcl中指定的)更新文本
if(例如NewElement!=null)
UpdateTextOnControl();
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
//如果文本或字体样式发生更改,则触发对重画控件的更新
if(e.PropertyName==nameof(HtmlLabel.Html))
{
UpdateTextOnControl();
}
}
作废UpdateTextOnControl()
{
if(Control==null)
返回;
if(元素为HtmlLabel formsElement)
{
var htmlastring=formsElement.Html??string.Empty;//由WebView使用
var htmlaspanned=Html.FromHtml(htmlastring,FromHtmlOptions.ModeCompact);//由TextView使用
Control.TextFormatted=htmlaspanned;
}
}
}
}
样本使用

主标题
副标题
这是一些html。看,这是一条下划线

看,这是被强调的。这里有一些大胆的建议

这是一份UL列表:
  • 一个
  • 两个
这是一个OL列表:
  • 一个
  • 两个
  • ]]>