【问题标题】:Display resource map image in UWP WebView Control在 UWP WebView 控件中显示资源地图图像
【发布时间】:2017-09-10 00:45:06
【问题描述】:

在这个link

它向我们展示了如何通过使用 ResourceMap 将 HTML 与文本和图像的内容共享出去。

但是对应的article 并没有向我们展示如何阅读它并正确地将其放入webview。

我知道如何取回资源图,但不知道如何最好地将其放入WebView

this.sharedResourceMap = await this.shareOperation.Data.GetResourceMapAsync();
foreach (KeyValuePair<string, RandomAccessStreamReference> item in this.sharedResourceMap)
{
    ResourceMapValue.Text += "\nKey: " + item.Key;
}

Item.Key 类似于 ms-appx:///Assets/Logo.png

【问题讨论】:

标签: c# xaml webview uwp win-universal-app


【解决方案1】:

您应该利用 IUriToStreamResolver 类。

在以下示例中,我加载了位于 Assets 文件夹中的 HTML 文件 (example.html)。 Assets 文件夹还包含 HTML 文件的所有图像。 应该重写 IUriToStreamResolverGetContent 方法,以将任何对 HTML 文件中指定的 URI(例如 )的请求转换为本地 uri 路径。在您的情况下,您可能需要调整 GetContent 以检索资源映射存储的文件。

public sealed partial class WebViewLocalImage : Page
{
    public WebViewLocalImage()
    {
        this.InitializeComponent();
        Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        var uri = this.myWebView.BuildLocalStreamUri("InternalAssets", "example.html");
        this.myWebView.NavigateToLocalStreamUri(uri, new StreamUriResolver());
    }
}

public sealed class StreamUriResolver : IUriToStreamResolver
{
    public IAsyncOperation<IInputStream> UriToStreamAsync(Uri uri)
    {
        string path = uri.AbsolutePath;
        return GetContent(path).AsAsyncOperation();
    }

    private async Task<IInputStream> GetContent(string URIPath)
    {
        try
        {
            Uri localUri = new Uri("ms-appx:///Assets/" + URIPath);
            StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(localUri);
            IRandomAccessStream stream = await f.OpenAsync(FileAccessMode.Read);
            return stream.GetInputStreamAt(0);
        }
        catch (Exception)
        {
            System.Diagnostics.Debug.WriteLine("Invalid URI");
        }
        return null;
    }
}

【讨论】:

  • 谢谢!您的回答让我可以研究有关 IUriToStreamResolver 的其他信息。顺便说一句,我正在编写一个共享目标,GetHtmlFormatAsync 会从共享源返回一个字符串。由于 NavigateToString 没有读取本地图像的能力。这是否意味着我必须首先将从 GetHtmlFormatAsync 收到的 HTML 片段写入文件,例如example.html,然后继续使用 BuildLocalStreamUri 和 NavigateToLocalStreamUri?
  • 我已经使用ms-appx-web协议成功读取了本地图片。试试下面的代码:string htmlContent = "&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Here is a local image: &lt;img src='ms-appx-web:///Assets/Logo.png'&gt;.&lt;/p&gt;"; myWebView.NavigateToString(htmlContent);
  • 您也可以通过将图像编码为base64字符串来将图像存储在html字符串本身中。详情请查看此答案:http://stackoverflow.com/questions/10363174/use-local-images-in-webbrowser-control#34276669。如果您需要解析 HTML 内容来修改链接,我建议您使用 HTMLAgilityPack,它在类似的功能上帮助了我很多。
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多