微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

有没有办法创建 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;

...

但如果页面尚未显示,则此方法不起作用。

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

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

...

        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,desiredWidth,desiredHeight));

...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。