Windows 存储呈现的 WebView html 大小
Windows Store WebView rendered html size
我非常需要 calculate/get 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 页面。
好的,我想出了一个解决方案:
我将这个字符串注入我的 html :
string injectionStyleAndScript = @"html,body {margin: 0;padding: 0;height: 100%;}function getHeight() { var height = document.getElementById('wrapper').offsetHeight; window.external.notify(''+height);}";
也就是说插入到
之前
htmlFragment – this is HTMl that i had to place on my WebView.
htmlFragment = htmlFragment.Insert(htmlFragment.IndexOf("</HEAD>"),injectionStyleAndScript); // Inser the Injection
接下来,要计算 body 内部,我将其包裹起来
查找从和到的索引:
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);
}
我不得不将注入脚本更改为:
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>";
我非常需要 calculate/get 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 页面。
好的,我想出了一个解决方案:
我将这个字符串注入我的 html :
string injectionStyleAndScript = @"html,body {margin: 0;padding: 0;height: 100%;}function getHeight() { var height = document.getElementById('wrapper').offsetHeight; window.external.notify(''+height);}";
也就是说插入到
之前htmlFragment – this is HTMl that i had to place on my WebView.
htmlFragment = htmlFragment.Insert(htmlFragment.IndexOf("</HEAD>"),injectionStyleAndScript); // Inser the Injection
接下来,要计算 body 内部,我将其包裹起来
查找从和到的索引:
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);
}
我不得不将注入脚本更改为:
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>";