将 Xamarin 表单页面捕获为位图而不附加到父级

Posted

技术标签:

【中文标题】将 Xamarin 表单页面捕获为位图而不附加到父级【英文标题】:Capture Xamarin Forms Page as bitmap without attaching to a parent 【发布时间】:2021-05-25 09:01:00 【问题描述】:

有没有一种方法可以创建 Xamarin 表单页面或其他视图结构并将其布局捕获到位图,而无需为其提供父级并首先显示它?

我能够在 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;

...

但如果页面尚未显示,这将不起作用。

我什至可以使用“屏幕外”解决方案或“隐藏窗口”来托管和呈现视图,而不会干扰 UI。我在 WPF 中做过这种类型的操作,但在 Xamarin 中似乎找不到合适的方法。最终,当 MAUI 到来时,我想创建一种多平台方式来执行此操作(Android、ios)和其他平台。

我还尝试添加以下代码来创建渲染器以强制创建页面:

...

        if (rend == null)
            rend = Platform.CreateRendererWithContext((Xamarin.Forms.VisualElement)parent, Android.App.Application.Context);

...

这会导致创建一个有效的渲染器,但生成的位图是空的

【问题讨论】:

您好,您的意思是需要捕获的页面尚未显示? @JuniorJiang:是的,没有显示的页面。我正在寻找一种在用户看不到的情况下呈现它的方法。 好吧,如果你已经解决了,记得有空的时候标记你的答案。 【参考方案1】:

经过大量实验,在捕获视图之前添加这些调用似乎会强制视图呈现:

...

view.Measure(desiredWidth, desiredHeight);
view.Layout(new Xamarin.Forms.Rectangle(0, 0, desiredWidth, desiredHeight));

...

【讨论】:

以上是关于将 Xamarin 表单页面捕获为位图而不附加到父级的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Http 401 错误,但在邮递员中工作,而不是在 xamarin 表单中工作

Xamarin 表单的 ANPR

Xamarin 安卓。将字节数组转换为位图。 Skia 解码器返回 false

xamarin 表单从按钮单击捕获列表视图

启动 Xamarin.forms 应用程序时出错:尝试绘制太大(165514752 字节)位图

Xamarin表单选项卡页面具有重叠的自定义视图