Xamarin.android 将StackLayout转换为Xamarin中的图像

Xamarin.android 将StackLayout转换为Xamarin中的图像,xamarin.android,xamarin.forms,Xamarin.android,Xamarin.forms,我正在从事Xmarin表单(PCL)项目,我想将StackLayout转换为图像/缓冲区,并将其发送到打印机进行硬打印 有人能在(Xamarin.Android&Xamarin.iOS)中建议怎么做吗?你不能。Xamarin没有这种特征。您应该为UIComponent编写一个渲染器 幸运的是,有一个实现,也有一个。你可以从他们身上得到启发。摘自link,这是我很久以前亲自使用的链接,下面的代码将截取整个页面的屏幕截图 最后我修改了代码,只截取了页面上某个特定视图的屏幕截图,并更改了其他一些内容,

我正在从事Xmarin表单(PCL)项目,我想将StackLayout转换为图像/缓冲区,并将其发送到打印机进行硬打印


有人能在(Xamarin.Android&Xamarin.iOS)中建议怎么做吗?

你不能。Xamarin没有这种特征。您应该为UIComponent编写一个渲染器

幸运的是,有一个实现,也有一个。你可以从他们身上得到启发。

摘自link,这是我很久以前亲自使用的链接,下面的代码将截取整个页面的屏幕截图

最后我修改了代码,只截取了页面上某个特定视图的屏幕截图,并更改了其他一些内容,但这个示例是我基于它的,所以请告诉我您是否希望看到该代码和/或下面的内容对您不起作用

首先,在表单项目中创建一个接口,IScreenshotManager.cs,例如:

public interface IScreenshotManager {
    Task<byte[]> CaptureAsync();
}
public class ScreenshotManager : IScreenshotManager {

    public static Activity Activity { get; set; }

    public async System.Threading.Tasks.Task<byte[]> CaptureAsync() {

        if(Activity == null) {

            throw new Exception("You have to set ScreenshotManager.Activity in your Android project");
        }

        var view = Activity.Window.DecorView;
        view.DrawingCacheEnabled = true;

        Bitmap bitmap = view.GetDrawingCache(true);

        byte[] bitmapData;

        using (var stream = new MemoryStream()) {
            bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return bitmapData;
    }
}
最后,我们在iOS上实现了这一点,ScreenshotManager.cs

public class ScreenshotManager : IScreenshotManager {
    public async System.Threading.Tasks.Task<byte[]> CaptureAsync() {
        var view = UIApplication.SharedApplication.KeyWindow.RootViewController.View;

        UIGraphics.BeginImageContext(view.Frame.Size);
        view.DrawViewHierarchy(view.Frame, true);
        var image = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();

        using(var imageData = image.AsPNG()) {
            var bytes = new byte[imageData.Length];
            System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, bytes, 0, Convert.ToInt32(imageData.Length));
            return bytes;
        }
    }
}
公共类ScreenshotManager:isScreenShotManager{
public async System.Threading.Tasks.Task captureAync(){
var view=UIApplication.SharedApplication.KeyWindow.RootViewController.view;
UIGraphics.BeginImageContext(view.Frame.Size);
view.DrawViewHierarchy(view.Frame,true);
var image=UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
使用(var imageData=image.AsPNG()){
var bytes=新字节[imageData.Length];
System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes,Bytes,0,Convert.ToInt32(imageData.Length));
返回字节;
}
}
}
public class ScreenshotManager : IScreenshotManager {
    public async System.Threading.Tasks.Task<byte[]> CaptureAsync() {
        var view = UIApplication.SharedApplication.KeyWindow.RootViewController.View;

        UIGraphics.BeginImageContext(view.Frame.Size);
        view.DrawViewHierarchy(view.Frame, true);
        var image = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();

        using(var imageData = image.AsPNG()) {
            var bytes = new byte[imageData.Length];
            System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, bytes, 0, Convert.ToInt32(imageData.Length));
            return bytes;
        }
    }
}