将 Xamarin Forms 页面捕获为位图而不附加到父级
Capture Xamarin Forms Page as bitmap without attaching to a parent
有没有一种方法可以创建 Xamarin Forms 页面或其他视图结构并将其布局捕获到位图,而无需为其提供父级并先显示它?
我能够在 Android:
中捕获这样一个已经呈现的页面
...
var parent = v as Xamarin.Forms.View;
var rend = Platform.GetRenderer((Xamarin.Forms.VisualElement)parent);
rend.Tracker.UpdateLayout();
var view = rend.View;
if (view == null)
throw new NullReferenceException("Unable to find the main window.");
var bitmap = Bitmap.CreateBitmap(view.Width, view.Height, Bitmap.Config.Argb8888);
using (var canvas = new Canvas(bitmap))
{
var drawable = view.Background;
if (drawable != null)
drawable.Draw(canvas);
else
canvas.DrawColor(Color.White);
view.Draw(canvas);
}
var result = new CaptureResult(bitmap) as ICaptureResult;
...
但如果页面尚未显示,这将不起作用。
我什至可以使用“屏幕外”解决方案或“隐藏 window”来托管和呈现视图,而不会 UI 受到干扰。我在 WPF 中做过这种类型的操作,但我似乎无法在 Xamarin 中找到合适的方法。最终我想创建一个多平台的方式来做到这一点(Android,iOS)和其他平台当 MAUI 到达时。
我还尝试添加以下代码来创建渲染器以强制创建页面:
...
if (rend == null)
rend = Platform.CreateRendererWithContext((Xamarin.Forms.VisualElement)parent, Android.App.Application.Context);
...
这会创建一个有效的渲染器,但生成的位图是空的
经过大量实验,在捕获视图之前添加这些调用似乎会强制视图呈现:
...
view.Measure(desiredWidth, desiredHeight);
view.Layout(new Xamarin.Forms.Rectangle(0, 0, desiredWidth, desiredHeight));
...
有没有一种方法可以创建 Xamarin Forms 页面或其他视图结构并将其布局捕获到位图,而无需为其提供父级并先显示它?
我能够在 Android:
中捕获这样一个已经呈现的页面...
var parent = v as Xamarin.Forms.View;
var rend = Platform.GetRenderer((Xamarin.Forms.VisualElement)parent);
rend.Tracker.UpdateLayout();
var view = rend.View;
if (view == null)
throw new NullReferenceException("Unable to find the main window.");
var bitmap = Bitmap.CreateBitmap(view.Width, view.Height, Bitmap.Config.Argb8888);
using (var canvas = new Canvas(bitmap))
{
var drawable = view.Background;
if (drawable != null)
drawable.Draw(canvas);
else
canvas.DrawColor(Color.White);
view.Draw(canvas);
}
var result = new CaptureResult(bitmap) as ICaptureResult;
...
但如果页面尚未显示,这将不起作用。
我什至可以使用“屏幕外”解决方案或“隐藏 window”来托管和呈现视图,而不会 UI 受到干扰。我在 WPF 中做过这种类型的操作,但我似乎无法在 Xamarin 中找到合适的方法。最终我想创建一个多平台的方式来做到这一点(Android,iOS)和其他平台当 MAUI 到达时。
我还尝试添加以下代码来创建渲染器以强制创建页面:
...
if (rend == null)
rend = Platform.CreateRendererWithContext((Xamarin.Forms.VisualElement)parent, Android.App.Application.Context);
...
这会创建一个有效的渲染器,但生成的位图是空的
经过大量实验,在捕获视图之前添加这些调用似乎会强制视图呈现:
...
view.Measure(desiredWidth, desiredHeight);
view.Layout(new Xamarin.Forms.Rectangle(0, 0, desiredWidth, desiredHeight));
...