2017-09-13 145 views
1

我正在开发基于Xamarin.Forms的项目,尝试打印带分页的webview内容。Xamarin.Forms UWP - 打印Webview和分页支持

我已经提到下面的链接已经: How do I print WebView content in a Windows Store App?

但不幸的是这种方式是不工作与Xamarin.Forms因为在上面的链接证明的方式使用webviewbrush(是通过填充矩形(窗口形状)矩形和webviewbrush都是与UWP平台相关的控件)。问题是我们无法使用webviewbrush绘制矩形(Xamarin Forms形状)。

作为一种变通方法,我做了以下内容:

  • 创造xamarin形成BoxView中的PCL项目
  • 创造了这个BoxView中的UWP项目渲染器(这会给我们的窗口矩形),然后我确实将这个矩形形状放入PCL项目的App.cs类中的一个公共静态属性中,以使其可用于Webviewrenderer.cs类,以便使用webviewbrush填充此矩形。
  • 我可以从UWP项目的webviewrenderer.cs类访问它,但问题是打印机对话框显示空白页面。
  • 如上面的堆栈溢出链接所示,分页工作正常,但所有页面都是空的。

显然问题是矩形。因为如果我创建本机UWP项目并且打印机对话框也显示网页,则相同的逻辑工作正常。

任何帮助将不胜感激。

在此先感谢!

回答

0

如上面的堆栈溢出链接所示,分页工作正常,但所有页面都是空的。

我已经根据您的过程实现了基本打印功能。我在webviewrenderer中放置了GetWebViewBrush方法。不幸的是,我身边也出现了同样的问题。

async Task<WebViewBrush> GetWebViewBrush(Windows.UI.Xaml.Controls.WebView webView) 
{ 
    // resize width to content 
    var _OriginalWidth = webView.Width; 
    var _WidthString = await webView.InvokeScriptAsync("eval", 
     new[] { "document.body.scrollWidth.toString()" }); 
    int _ContentWidth; 

    if (!int.TryParse(_WidthString, out _ContentWidth)) 
     throw new Exception(string.Format("failure/width:{0}", _WidthString)); 

    webView.Width = _ContentWidth; 

    // resize height to content 
    var _OriginalHeight = webView.Height; 

    var _HeightString = await webView.InvokeScriptAsync("eval", 
     new[] { "document.body.scrollHeight.toString()" }); 
    int _ContentHeight; 

    if (!int.TryParse(_HeightString, out _ContentHeight)) 
     throw new Exception(string.Format("failure/height:{0}", _HeightString)); 

    webView.Height = _ContentHeight; 

    // create brush 
    var _OriginalVisibilty = webView.Visibility; 

    webView.Visibility = Windows.UI.Xaml.Visibility.Visible; 

    var _Brush = new WebViewBrush 
    { 
     Stretch = Stretch.Uniform, 
     SourceName = webView.Name 
    }; 
    // _Brush.SetSource(webView); 

    _Brush.Redraw(); 

    // reset, return 
    webView.Width = _OriginalWidth; 
    webView.Height = _OriginalHeight; 
    webView.Visibility = _OriginalVisibilty; 
    return _Brush; 
} 

当我调试运行,我发现webView.Name从未设定值,所以我提出一个新的Name属性为customWebView。

public static readonly BindableProperty NameProperty = BindableProperty.Create(
propertyName: "Name", 
returnType: typeof(string), 
declaringType: typeof(MyWebView), 
defaultValue: default(string)); 

    public string Name 
    { 
     get { return (string)GetValue(NameProperty); } 
     set { SetValue(NameProperty, value); } 
    } 

} 

并设置天然对照()与OnElementChanged方法如下代码的Name属性。

if (e.NewElement != null) 
{ 
    Control.Name = (Element as MyWebView).Name; 
    Control.NavigationCompleted += Control_NavigationCompleted; 
} 

令人惊讶的是,页面不再是空的。 enter image description here

+0

太棒了!这就像一个魅力!非常感谢你:) –

+0

@清道夫:谢谢,我已经完成了! –