使用本地css Xamarin表单设置外部网页的样式

使用本地css Xamarin表单设置外部网页的样式,css,xamarin.forms,webview,Css,Xamarin.forms,Webview,我正在从后端获取一个外部页面HTML代码作为字符串 并将其显示在Xamarin forms应用程序的网络视图中 现在我想做一个风格 我想知道最有效的方法是什么 有没有可能像Xamarin页面使用XAML和共享资源进行样式化一样对其进行样式化 到目前为止,我试图引用共享资源中的CSS文件,但我发现它不起作用 htmlData = "<link rel=\"stylesheet\" type=\"text/css\"href=\"Assets\"Styles\"style.css\" />

我正在从后端获取一个外部页面HTML代码作为字符串

并将其显示在Xamarin forms应用程序的网络视图中

现在我想做一个风格

我想知道最有效的方法是什么

有没有可能像Xamarin页面使用XAML和共享资源进行样式化一样对其进行样式化

到目前为止,我试图引用共享资源中的CSS文件,但我发现它不起作用

htmlData = "<link rel=\"stylesheet\" type=\"text/css\"href=\"Assets\"Styles\"style.css\" />" + htmlData; 
htmlSource.Html = htmlData;
myWebView.Source = htmlSource;
htmlData=”“+htmlData;
Html=htmlData;
myWebView.Source=htmlSource;
更新

我最终为Webview使用了自定义渲染器

它适用于Android,但不适用于IOS

这是我的渲染器的IOS实现

    [assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace XXX.iOS.Renderers
{
    public class CustomWebViewRenderer : WkWebViewRenderer
    {
        WKUserContentController userController;

        public CustomWebViewRenderer() : this(new WKWebViewConfiguration())
        {
        }
        public CustomWebViewRenderer(WKWebViewConfiguration config) : base(config)
        {
            userController = config.UserContentController;
        }

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            var customWebView = e.NewElement as CustomWebView;

            if (e.NewElement != null)
            {
                string htmldata = customWebView.HTMLData;

                htmldata = "<link rel=\"stylesheet\" type=\"text/css\" href=\"StyleSheet.css\" />" + htmldata;

                WkWebViewRenderer wkWebViewRenderer = new WkWebViewRenderer();

                NSData data = NSData.FromString(htmldata);

                wkWebViewRenderer.LoadData(data,"text/html", "UTF-8",new NSUrl(""));
            }
        }
    }
}
[程序集:ExportRenderer(typeof(CustomWebView)、typeof(CustomWebViewRenderer))]
命名空间XXX.iOS.Renderers
{
公共类CustomWebViewRenderer:WkWebViewRenderer
{
WKUserContentController用户控制器;
公共CustomWebViewRenderer():此(新的WKWebViewConfiguration())
{
}
公共CustomWebViewRenderer(WKWebViewConfiguration配置):基本(配置)
{
userController=config.UserContentController;
}
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var customWebView=e.NewElement作为customWebView;
if(例如NewElement!=null)
{
字符串htmldata=customWebView.htmldata;
htmldata=“”+htmldata;
WkWebViewRenderer WkWebViewRenderer=新的WkWebViewRenderer();
NSData data=NSData.FromString(htmldata);
wkWebViewRenderer.LoadData(数据,“文本/html”、“UTF-8”、新NSUrl(“”);
}
}
}
}

注意:我不知道IOS代码在这里发生了什么,因为我从来没有用母语编码过,我不知道这对您是否可行,但您可以将实际的CSS注入HTML字符串中,然后分配
HtmlSource

var css=ReadStringFromAsset(“style.css”);
htmlData=InjectCssInHtml(htmlData,css);
Html=htmlData;
myWebView.Source=htmlSource;
根据您对接收的HTML的控制程度,您可以选择如何实现
InjectCssInHtml

伪标记注释 如果更改HTML是可行的,则可以将HTML注释添加为pdeudo标记。这将使代码变得简单,但必须相应地编辑每个HTML


...
您的
InjectCssInHtml
然后成为

stringinjectcssinhtml(stringhtml,stringcss)
{
返回html.Replace(“,css);
}
不编辑HTML 如果编辑HTML不可行,则
InjectCssInHtml
会变得稍微复杂一些。下面是第一个猜测,但我想你明白了

stringinjectcssinhtml(stringhtml,stringcss)
{
字符串代码输入;
int indexToInject=0;
if(containssStyleTag(html))
{
indexToInject=IndexOfStyleTagContent(html);
codeToInject=css;
}
else if(ContainsHeadTag(html))
{
indexToInject=IndexOfHeadTagContents(html);
codeToInject=$“{css}”;
}
其他的
{
indexToInject=IndexOfHTMLtagContent(html);
codeToInject=$“{css}”;
}
返回html.Insert(indexToInject、codeToInject);
}
当然,这并没有涵盖每一种可能的情况,但我想你明白了。ìf-else `可以被抽象的工厂代际模式和策略行为模式所取代

stringinjectcssinhtml(stringhtml,stringcss)
{
ICssInjector injector=injectorFactory.CreateInjector(html);
返回injector.InjectCss(html,css);
}

谢谢你的回答,我会试试看。但我只是用我目前的方法更新了我的问题。任何反馈都是好的。我最后尝试了你的答案。它成功了。再次感谢。