Xamarin.forms Listview中的HTML

Xamarin.forms Listview中的HTML,xamarin.forms,Xamarin.forms,我需要显示来自wordpress的帖子标题列表。标题中包含unicode字符。像这样"代码"&"8220,;我不会忘记”我希望它显示“我不会忘记” 在代码隐藏中System.Net.WebUtility.HtmlDecode(text.Title.Rendered)将处理它。我能在XAMAL里做吗 <ListView x:Name="postList" ItemSelected="Handle_ItemSelected"> <ListView.Item

我需要显示来自wordpress的帖子标题列表。标题中包含unicode字符。像这样"代码"&"8220,;我不会忘记”我希望它显示“我不会忘记”

在代码隐藏中
System.Net.WebUtility.HtmlDecode(text.Title.Rendered)
将处理它。我能在XAMAL里做吗

    <ListView x:Name="postList" ItemSelected="Handle_ItemSelected">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Label FormattedText="{Binding Title.Rendered}"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


基于@Jason所说的代码:使用转换器

创建一个名为HtmlConverter的类:

using System;
using Xamarin.Forms;

namespace StackoverflowQ.Converters
{
    public class HtmlConverter : IValueConverter
    {
        #region Converter

        public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                string text = (string)value;
                return System.Net.WebUtility.HtmlDecode(text);
            }
            else
            {
                return "";
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }

        #endregion
    }
}
在您的xaml引用中,该类(我的类位于名为转换器的文件夹中)

然后将它添加到您的资源字典中,从那里您应该可以引用它

<?xml version="1.0" encoding="utf-8"?>
<ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="StackoverflowQ.Views.MainPage" 
    Title="{Binding Title}">
    <ContentPage.Resources>
        <ResourceDictionary> 
            <converters:HtmlConverter x:Key="HtmlConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>
    <StackLayout HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"> 

    <ListView x:Name="postList" ItemSelected="Handle_ItemSelected">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Label  Text="{Binding Title.Rendered , Converter={StaticResource HtmlConverter}}"  />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


    </StackLayout>
</ContentPage>

您可以创建一个标签渲染器来转换HTML文本,如下所示:

自定义标签:

public class CustomLabel: Label
{
}
Android渲染器:

[assembly: ExportRenderer(typeof(CustomLabel), typeof(HtmlFormattedLabelRenderer))]
 namespace XYZ.Droid.Renderer
{
  public class HtmlFormattedLabelRenderer : LabelRenderer
   {
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        var view = (CustomLabel)Element;
        if (view == null) return;
        if(!string.IsNullOrEmpty(Control.Text))
          Control.SetText(Html.FromHtml(view.Text.ToString()), TextView.BufferType.Spannable);
    }
  }
}
[assembly: ExportRenderer(typeof(CustomLabel), typeof(HtmlFormattedLabelRendereriOS))]
namespace XYZ.iOS.Renderer
{
  public class HtmlFormattedLabelRendereriOS:LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

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

        var attr = new NSAttributedStringDocumentAttributes();
        var nsError = new NSError();
        attr.DocumentType = NSDocumentType.HTML;

        Control.AttributedText = new NSAttributedString(view.Text, attr, ref nsError);

        var mutable = Control.AttributedText as NSMutableAttributedString;
        UIStringAttributes uiString = new UIStringAttributes();
        uiString.Font = UIFont.FromName("Roboto-Regular",15f);
        uiString.ForegroundColor = UIColor.FromRGB(130, 130, 130);
        mutable.SetAttributes(uiString, new NSRange(0, Control.Text.Length));
    }
  }
}
[程序集:ExportRenderer(typeof(CustomLabel)、typeof(HtmlFormattedLabelRenderer))]
命名空间XYZ.Droid.Renderer
{
公共类HtmlFormattedLabelRenderer:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var视图=(CustomLabel)元素;
if(view==null)返回;
如果(!string.IsNullOrEmpty(Control.Text))
Control.SetText(Html.FromHtml(view.Text.ToString()),TextView.BufferType.Spannable);
}
}
}
iOS渲染器:

[assembly: ExportRenderer(typeof(CustomLabel), typeof(HtmlFormattedLabelRenderer))]
 namespace XYZ.Droid.Renderer
{
  public class HtmlFormattedLabelRenderer : LabelRenderer
   {
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

        var view = (CustomLabel)Element;
        if (view == null) return;
        if(!string.IsNullOrEmpty(Control.Text))
          Control.SetText(Html.FromHtml(view.Text.ToString()), TextView.BufferType.Spannable);
    }
  }
}
[assembly: ExportRenderer(typeof(CustomLabel), typeof(HtmlFormattedLabelRendereriOS))]
namespace XYZ.iOS.Renderer
{
  public class HtmlFormattedLabelRendereriOS:LabelRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged(e);

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

        var attr = new NSAttributedStringDocumentAttributes();
        var nsError = new NSError();
        attr.DocumentType = NSDocumentType.HTML;

        Control.AttributedText = new NSAttributedString(view.Text, attr, ref nsError);

        var mutable = Control.AttributedText as NSMutableAttributedString;
        UIStringAttributes uiString = new UIStringAttributes();
        uiString.Font = UIFont.FromName("Roboto-Regular",15f);
        uiString.ForegroundColor = UIColor.FromRGB(130, 130, 130);
        mutable.SetAttributes(uiString, new NSRange(0, Control.Text.Length));
    }
  }
}
[程序集:ExportRenderer(typeof(CustomLabel)、typeof(HtmlFormattedLabelRendereriOS))]
命名空间XYZ.iOS.Renderer
{
公共类HtmlFormattedLabelRenderIOS:LabelRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var视图=(CustomLabel)元素;
if(view==null)返回;
var attr=新的NSAttributed StringDocumentAttribute();
var nsError=新的nsError();
attr.DocumentType=NSDocumentType.HTML;
Control.AttributedText=新的NSAttributedString(view.Text、attr、ref-nsError);
var mutable=Control.attributeText作为NSMutableAttributeString;
UIStringAttributes uiString=新的UIStringAttributes();
uiString.Font=UIFont.FromName(“Roboto常规”,15f);
uiString.ForegroundColor=UIColor.FromRGB(130130130);
SetAttributes(uiString,新的NSRange(0,Control.Text.Length));
}
}
}

希望这可以解决您的问题。

Forms9Patch.Label的HtmlText属性解码转义。Forms9Patch是一个免费的开源(MIT许可)NuGet软件包。完全披露:我是Forms9Patch的作者。

使用值转换器谢谢你@LeRoy!这太完美了。我以前使用过转换器来计算UI组件的大小,但从未想过使用转换器来计算UI组件的大小。