Windows应用商店WebView呈现的html大小

时间:2015-03-18 16:47:20

标签: c# xaml webview windows-store-apps windows-8.1

我非常需要在WebView中计算/获取渲染的html大小。

有没有办法实现这个目标?

在Objective-C中,我可以将HTML字符串传递给WebView并提供可用的大小,并返回所需的大小。

Windows Store WebView中是否存在与此类似的内容?

例如:

WebView webView = new WebView();
webView.NavigateToString(html);
webView.ContentLoaded+= webView_ContentLoaded(,);

webView_ContentLoaded(,)
{
    //Height=99999999 - does the trick, like available height is infinite
    //Width=200 - means that width is limited to 200px
    Size desiredSize = webView.Content.Measure(new Size{Height=99999999, Width=200}());
}

根据desiredSize值,我可以调整WebView的大小以防止在WebView中滚动,并将所有内容放在XAML页面上。

2 个答案:

答案 0 :(得分:3)

好的,我想出了一个解决方案:

我把这个字符串注入了我的html:

string injectionStyleAndScript = @“html,body {margin:0; padding:0; height:100%;} function getHeight(){var height = document.getElementById('wrapper')。offsetHeight; window.external.notify ( '' +高度);}“;

这意味着在

之前插入它
htmlFragment – this is HTMl that i had to place on my WebView.
htmlFragment = htmlFragment.Insert(htmlFragment.IndexOf("</HEAD>"),injectionStyleAndScript); // Inser the Injection

接下来,为了计算身体内部,我将它包裹起来

从以下位置查找索引:

int from = htmlFragment.IndexOf("<BODY>")+6;
int to = htmlFragment.IndexOf("</BODY>");

接下来包装内的所有内容。

string bodyWrapper = string.Format("<div id='wrapper'>{0}</div>", htmlFragment.Substring(from, (htmlFragment.Length - 1 - from)-(htmlFragment.Length - 1 - to)));

接下来,将旧内容替换为新内容(我们在包装器中创建):

//Cut out the old one
htmlFragment = htmlFragment.Remove(from, (htmlFragment.Length - 1 - from) - (htmlFragment.Length - 1 - to));
//Insert our wrapper
htmlFragment = htmlFragment.Insert(from, bodyWrapper);
//Navigate to the HTML
MyWebView.NavigateToString(htmlFragment);

接下来我们需要将2个事件附加到WebView - DOMContentLoaded和ScriptNotify:

MyWebView.ScriptNotify += MyWebView;
MyWebView.DOMContentLoaded += MyWebView;
MyWebView.NavigateToString(htmlFragment);

以下是两个事件处理程序:

void MyWebView_DOMContentLoaded(WebView sender, WebViewDOMContentLoadedEventArgs args)
{
    MyWebView.InvokeScriptAsync("getHeight", null);
}

void MyWebView_ScriptNotify(object sender, NotifyEventArgs e)
{
    string result = e.Value.ToString();
    MyWebView.Height = double.Parse(result);
}

答案 1 :(得分:0)

我必须将注射脚本更改为:

string injectionStyleAndScript = @"<style> html,body {margin: 0;padding: 0;height: 100%;} </style><script type='text/javascript'>function getHeight() { var height = document.getElementById('wrapper').offsetHeight; window.external.notify(''+height);}</script>";