Xamarin表示Webview本地

时间:2017-05-16 20:48:12

标签: c# webview xamarin.forms

我正在尝试在本地使用Xamarin在Webview中加载Web应用程序(Readium)。作为目标,我有UWP,Android和iOS。 我无法打开index.html页面,根据https://developer.xamarin.com/guides/xamarin-forms/user-interface/webview/,我已在每个项目中嵌入了网页,但我得到一个空白页面。

为每个应用程序实现了依赖服务,例如(UWP)

assembly: Dependency(typeof(BaseUrl))]
namespace WorkingWithWebview.UWP
{
    public class BaseUrl : IBaseUrl
    {
        public string Get()
        {
            return "ms-appx-web:///";
        }
    }
}

但是,创建一个新的UWP项目(没有Xamarin),它运行良好,使用方法NavigateToLocalStreamUri(uri,new StreamUriWinRTResolver())和

public IAsyncOperation<IInputStream> UriToStreamAsync(Uri uri)
{
    if (uri == null)
    {
        throw new Exception();
    }
    string path = uri.AbsolutePath; 
    return GetContent(path).AsAsyncOperation();
}

private async Task<IInputStream> GetContent(string path)
{  
    try
    {
        Uri localUri = new Uri("ms-appx:///cloud-reader" + path);
        StorageFile f = await StorageFile.GetFileFromApplicationUriAsync(localUri);
        IRandomAccessStream stream = await f.OpenAsync(FileAccessMode.Read);
        return stream;
    }
    catch (Exception)
    {
        throw new Exception("Invalid path");
    }
}

在Xamarin Forms中以同样的方式完成同样的事情? 谢谢你。

1 个答案:

答案 0 :(得分:2)

最后,我实现了加载本地内容,为每个平台添加自定义渲染。

示例(UWP):

[assembly: ExportRenderer(typeof(WebView), typeof(WebViewRenderer))]
namespace DisplayEpub.UWP{
public class CustomWebViewRenderer : WebViewRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            var customWebView = Element as WebView;
            Control.Source = new Uri(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html"));
        }
    }
}
}

我遵循Xamarin文档的示例,使用自定义渲染显示PDF,定位3个平台。我在Android和Windows上测试过它: https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/display-pdf/