2016-09-07 18 views
1

Xmarin Forms(PCL)プロジェクトで作業していますが、StackLayoutをイメージ/バッファに変換し、ハードプリント用にプリンタに送信したいと思います。XamarinでStackLayoutをイメージに変換する

どのようにして(Xamarin.Android & Xamarin.iOS)でもそれを行う方法を提案できますか?

答えて

1

できません。 Xamarinにはそのような機能はありません。 UIComponentのレンダラーを記述する必要があります。

幸いにも、Objective-C iOSの実装と、Androidの実装があります。あなたはそれらから刺激を受けることができます。

0

出典: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; 
     } 
    } 
} 
関連する問題