, , HTML-. , 500 . HTML-. , HTML- , .
-. UWP, .
, , , , , , 90% .
, . - . . . , ( :)), # . .
XAML
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<WebView x:Name="wv" Source="http://www.stackoverflow.com"></WebView>
</Grid>
#
public MainPage()
{
this.InitializeComponent();
wv.LoadCompleted += Wv_LoadCompleted;
}
async private void Wv_LoadCompleted(object sender, NavigationEventArgs e)
{
var allPages = await GetWebPages(wv, new Windows.Foundation.Size(100d, 150d));
}
async Task<IEnumerable<FrameworkElement>> GetWebPages(WebView webView, Windows.Foundation.Size pageSize)
{
var widthFromView = await webView.InvokeScriptAsync("eval", new[] { "document.body.scrollWidth.toString()" });
int contentWidth;
if (!int.TryParse(widthFromView, out contentWidth))
throw new Exception(string.Format("failure/width:{0}", widthFromView));
webView.Width = contentWidth;
var heightFromView = await webView.InvokeScriptAsync("eval", new[] { "document.body.scrollHeight.toString()" });
int contentHeight;
if (!int.TryParse(heightFromView, out contentHeight))
throw new Exception(string.Format("failure/height:{0}", heightFromView));
webView.Height = contentHeight;
var scale = pageSize.Width / contentWidth;
var scaledHeight = (contentHeight * scale);
var pageCount = (double)scaledHeight / pageSize.Height;
pageCount = pageCount + ((pageCount > (int)pageCount) ? 1 : 0);
var pages = new List<Windows.UI.Xaml.Shapes.Rectangle>();
for (int i = 0; i < (int)pageCount; i++)
{
var translateY = -pageSize.Height * i;
var page = new Windows.UI.Xaml.Shapes.Rectangle
{
Height = pageSize.Height,
Width = pageSize.Width,
Margin = new Thickness(5),
Tag = new TranslateTransform { Y = translateY },
};
page.Loaded += async (s, e) =>
{
var rectangle = s as Windows.UI.Xaml.Shapes.Rectangle;
var wvBrush = await GetWebViewBrush(webView);
wvBrush.Stretch = Stretch.UniformToFill;
wvBrush.AlignmentY = AlignmentY.Top;
wvBrush.Transform = rectangle.Tag as TranslateTransform;
rectangle.Fill = wvBrush;
};
pages.Add(page);
}
return pages;
}
async Task<WebViewBrush> GetWebViewBrush(WebView webView)
{
var originalWidth = webView.Width;
var widthFromView = await webView.InvokeScriptAsync("eval", new[] { "document.body.scrollWidth.toString()" });
int contentWidth;
if (!int.TryParse(widthFromView, out contentWidth))
throw new Exception(string.Format("failure/width:{0}", widthFromView));
webView.Width = contentWidth;
var originalHeight = webView.Height;
var heightFromView = await webView.InvokeScriptAsync("eval", new[] { "document.body.scrollHeight.toString()" });
int contentHeight;
if (!int.TryParse(heightFromView, out contentHeight))
throw new Exception(string.Format("failure/height:{0}", heightFromView));
webView.Height = contentHeight;
var originalVisibilty = webView.Visibility;
webView.Visibility = Windows.UI.Xaml.Visibility.Visible;
var wvBrush = new WebViewBrush
{
SourceName = webView.Name,
Stretch = Stretch.Uniform
};
wvBrush.Redraw();
webView.Width = originalWidth;
webView.Height = originalHeight;
webView.Visibility = originalVisibilty;
return wvBrush;
}