Xmarin Forms(PCL)プロジェクトで作業していますが、StackLayoutをイメージ/バッファに変換し、ハードプリント用にプリンタに送信したいと思います。XamarinでStackLayoutをイメージに変換する
どのようにして(Xamarin.Android & Xamarin.iOS)でもそれを行う方法を提案できますか?
Xmarin Forms(PCL)プロジェクトで作業していますが、StackLayoutをイメージ/バッファに変換し、ハードプリント用にプリンタに送信したいと思います。XamarinでStackLayoutをイメージに変換する
どのようにして(Xamarin.Android & Xamarin.iOS)でもそれを行う方法を提案できますか?
できません。 Xamarinにはそのような機能はありません。 UIComponentのレンダラーを記述する必要があります。
幸いにも、Objective-C iOSの実装と、Androidの実装があります。あなたはそれらから刺激を受けることができます。
出典:this私が個人的に使っているリンクですが、かなり長い間、次のコードはページ全体のスクリーンショットを撮ります。
私は、ページ上の特定のビューのスクリーンショットを撮るだけでなく、他のいくつかのものを変更するようにコードを修正しましたが、この例は私がそれをベースにしたものです。コード、および/または以下のものがあなたのために働いていない場合。
public interface IScreenshotManager {
Task<byte[]> CaptureAsync();
}
は、今、私たちは、Androidでの私たちのインターフェイスを実装する必要があり、ScreenshotManager_Android.cs例えば:
まずあなたがIScreenshotManager.cs例えば、あなたのフォームプロジェクトにインターフェイスを作成します
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;
}
}
をMainActivity
に設定します。
public class MainActivity : Xamarin.Forms.Platform.Android.FormsApplicationActivity {
protected override async void OnCreate(Android.OS.Bundle bundle) {
...
ScreenshotManager.Activity = this; //There are better ways to do this but this is what the example from the link suggests
...
}
}
最後に私たちは夢中になるし、それをScreenshotManager_iOS.csに名前を付けることができます、iOSの上でこれを実装:
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;
}
}
}