Xamarin.Forms UWP - 打印Webview和分页支持
问题描述:
我正在开发基于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项目并且打印机对话框也显示网页,则相同的逻辑工作正常。
任何帮助将不胜感激。
在此先感谢!
答
如上面的堆栈溢出链接所示,分页工作正常,但所有页面都是空的。
我已经根据您的过程实现了基本打印功能。我在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;
}
太棒了!这就像一个魅力!非常感谢你:) –
@清道夫:谢谢,我已经完成了! –