Xamarin 我需要从文件中加载HTML和CSS(不同于ANDROID和IOS)并在WebView中显示?

Xamarin 我需要从文件中加载HTML和CSS(不同于ANDROID和IOS)并在WebView中显示?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,请参阅我下面的评论,然后再将此标记为另一个问题的完全副本,该问题并不寻找相同的内容 到目前为止,我已经尝试像这样在本地加载: <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Japanese;assembly=Test" x:Class="

请参阅我下面的评论,然后再将此标记为另一个问题的完全副本,该问题并不寻找相同的内容

到目前为止,我已经尝试像这样在本地加载:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:Japanese;assembly=Test" 
    x:Class="Test.HelpCards" 
    x:Name="HelpCards" 
    Title="Help ▹ Cards Tab">
    <ContentPage.Content>
        <WebView x:Name="Browser" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" />
    </ContentPage.Content>
</ContentPage>

public HelpCards()
{
    InitializeComponent();
    var htmlSource = new HtmlWebViewSource();
    htmlSource.Html = @"<html><body>
    <h1>ABC</h1>
    <p>DEF</p>
    </body></html>";
    Browser.Source = htmlSource;
}
我的HTML是这样的:

<!DOCTYPE html>
<html>
    <head>
       <meta charset="utf-8" />
       <link rel="stylesheet" href="styles.css">
    </head>
    <body>
        Hello again
        <h1>hihi</h1>
    </body>
</html>
  • 要拥有共享html文件,您可以在共享PCL项目中注册它们。确保按名称引用特定于平台的css文件。示例html文件如下所示:

    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="styles.css">
    </head>
    
  • 为android实现同样的功能

    [assembly: Dependency(typeof(AppNamespace.Droid.BaseUrl))]
    namespace AppNamespace.Droid
    {
        public class BaseUrl : IBaseUrl
        {
            public string Get()
            {
                return "file:///android_asset/";
            }
        }
    }
    
  • 而iOS呢

    [assembly: Dependency(typeof(AppNamespace.iOS.BaseUrl))]
    namespace AppNamespace.iOS
    {
        public class BaseUrl : IBaseUrl
        {
            public string Get()
            {
                return NSBundle.MainBundle.BundlePath;
            }
        }
    }
    
  • 现在,您可以将
    WebView
    设置为使用共享html文件,同时使用特定于平台的css,这是通过
    BaseUrl
    指定的

    var assembly = typeof(AppNamespace.App).GetTypeInfo().Assembly;
    var stream = assembly.GetManifestResourceStream("AppNamespace.Common.html");
    string html = string.Empty;
    using (var reader = new System.IO.StreamReader(stream))
    {
        html = reader.ReadToEnd();
    }
    
    var source = new HtmlWebViewSource()
    {
        BaseUrl = DependencyService.Get<IBaseUrl>().Get(),
        Html = html
    };
    
    webView.Source = source;
    
    var assembly=typeof(AppNamespace.App).GetTypeInfo().assembly;
    var stream=assembly.GetManifestResourceStream(“AppNamespace.Common.html”);
    string html=string.Empty;
    使用(var reader=new System.IO.StreamReader(stream))
    {
    html=reader.ReadToEnd();
    }
    var source=新的HtmlWebViewSource()
    {
    BaseUrl=DependencyService.Get().Get(),
    Html=Html
    };
    webView.Source=Source;
    
  • 要拥有共享html文件,您可以在共享PCL项目中注册它们。确保按名称引用特定于平台的css文件。示例html文件如下所示:

    <head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="styles.css">
    </head>
    
  • 为android实现同样的功能

    [assembly: Dependency(typeof(AppNamespace.Droid.BaseUrl))]
    namespace AppNamespace.Droid
    {
        public class BaseUrl : IBaseUrl
        {
            public string Get()
            {
                return "file:///android_asset/";
            }
        }
    }
    
  • 而iOS呢

    [assembly: Dependency(typeof(AppNamespace.iOS.BaseUrl))]
    namespace AppNamespace.iOS
    {
        public class BaseUrl : IBaseUrl
        {
            public string Get()
            {
                return NSBundle.MainBundle.BundlePath;
            }
        }
    }
    
  • 现在,您可以将
    WebView
    设置为使用共享html文件,同时使用特定于平台的css,这是通过
    BaseUrl
    指定的

    var assembly = typeof(AppNamespace.App).GetTypeInfo().Assembly;
    var stream = assembly.GetManifestResourceStream("AppNamespace.Common.html");
    string html = string.Empty;
    using (var reader = new System.IO.StreamReader(stream))
    {
        html = reader.ReadToEnd();
    }
    
    var source = new HtmlWebViewSource()
    {
        BaseUrl = DependencyService.Get<IBaseUrl>().Get(),
        Html = html
    };
    
    webView.Source = source;
    
    var assembly=typeof(AppNamespace.App).GetTypeInfo().assembly;
    var stream=assembly.GetManifestResourceStream(“AppNamespace.Common.html”);
    string html=string.Empty;
    使用(var reader=new System.IO.StreamReader(stream))
    {
    html=reader.ReadToEnd();
    }
    var source=新的HtmlWebViewSource()
    {
    BaseUrl=DependencyService.Get().Get(),
    Html=Html
    };
    webView.Source=Source;
    

  • PCL项目不包含资产/捆绑资源等。。除非它们是基于程序集的嵌入式资源,否则您始终可以嵌入HTML文件并将其加载到字符串中,并将其分配给您的
    WebView
    ,就平台相关CSS而言,将其加载到基于平台相关方法的字符串中,并在将字符串应用到WebViewPCL项目不包含资产/捆绑资源/等之前将CSS注入HTML字符串。。除非它们是基于程序集的嵌入式资源,否则您始终可以嵌入HTML文件并将其加载到字符串中,然后将其分配给
    WebView
    ,对于依赖于平台的CSS,请根据依赖于平台的方法将其加载到字符串中,并在将字符串应用到WebView之前将CSS注入HTML字符串谢谢,我会尝试一下,如果我有任何问题,我会告诉你。我已经尝试了你的答案,但是看起来css文件没有包含在资源包中,或者它没有被调用。我在示例中也注意到了同样的情况:我对default.css所做的任何更改都不会反映在我看到的内容中。如果你能试试这个,如果你看到同样的东西,请告诉我,我将不胜感激。请注意,到目前为止我只尝试了iOS。ThanksI更新了问题,以显示我遇到的问题。对其进行了测试-它按预期工作。是否存在名称不匹配问题?您可以在此重新生成时访问代码,所有这些代码都修复了问题。谢谢谢谢,我会尝试一下,如果我有任何问题,我会告诉你。我已经尝试了你的答案,但是看起来css文件没有包含在资源包中,或者没有被调用。我在示例中也注意到了同样的情况:我对default.css所做的任何更改都不会反映在我看到的内容中。如果你能试试这个,如果你看到同样的东西,请告诉我,我将不胜感激。请注意,到目前为止我只尝试了iOS。ThanksI更新了问题,以显示我遇到的问题。对其进行了测试-它按预期工作。是否存在名称不匹配问题?您可以在此重新生成时访问代码,所有这些代码都修复了问题。谢谢