Xamarin.Formsでクリップボードを使う

Xamarin.Formsでクリップボードの機能を使用するには、

Xamarin.Formsにインターフェースを作成し、

各プラットフォームのプロジェクトで作成したインターフェースを実装する必要があります。

 

まずはXamarin.Formsプロジェクトにクリップボードを使用するための

インターフェース作成します。

IClipBoard.cs


using System;
namespace ClipSample
{
	public interface IClipBoard
	{
		//ペースト用メソッド
		String GetTextFromClipBoard();
		//コピー用メソッド
		bool SetTextToClipBoard(string text);
	}
}

 

Androidプロジェクトにインターフェースの実装クラスを作成します

ClipBoard_Droid.cs


using Android.Content;
using ClipSample.Droid;
using Xamarin.Forms;

[assembly: Dependency(typeof(ClipBoard_Droid))]

namespace ClipSample.Droid
{
	
	public class ClipBoard_Droid : IClipBoard
	{
		//ペースト用メソッド
		public string GetTextFromClipBoard()
		{
			//クリップボードからテキストを取得
			var clipboardmanager = (ClipboardManager)Forms.Context.GetSystemService(Context.ClipboardService);
			var item = clipboardmanager.PrimaryClip.GetItemAt(0);
			var text = item.Text;
			return text;
		}
		//コピー用メソッド
		public bool SetTextToClipBoard(string text)
		{
			//引数のテキストをクリップボードに格納
			var clipboardManager = (ClipboardManager)Forms.Context.GetSystemService(Context.ClipboardService);
			ClipData clip = ClipData.NewPlainText("", text);
			clipboardManager.PrimaryClip = clip;

			return true;
		}
	}
}

 

iOSプロジェクトにインターフェースの実装クラスを作成します

ClipBoard_iOS.cs


using Foundation;
using ClipSample.iOS;
using UIKit;

[assembly: Xamarin.Forms.Dependency(typeof(ClipBoard_iOS))]

namespace ClipSample.iOS
{
	public class ClipBoard_iOS:IClipBoard
	{
		//ペースト用メソッド
		public string GetTextFromClipBoard()
		{
			//クリップボードからテキストを取得
			var pb = UIPasteboard.General.GetValue("public.utf8-plain-text");
			return pb.ToString();
		}
		//コピー用メソッド
		public bool SetTextToClipBoard(string text){
			//引数のテキストをクリップボードに格納
			UIPasteboard.General.SetValue(new NSString(text), MobileCoreServices.UTType.Text);
			return true;
		}
	}
}

Xamarin.Formsプロジェクトで実際に使用するには、

DepedencyServiceクラスを使用して、各プラットフォームで作成した

実装クラスのメソッドを呼び出します。

ClipSamplePage.xaml.cs


namespace ClipSample
{
	public partial class ClipSamplePage : ContentPage
	{
		//中略
		
		//ペースト
		public void onPast(object sender, EventArgs e)
		{
			var clipboardText = DependencyService.Get().GetTextFromClipBoard();
		}
		
		//コピー
		public void onCopy(object sender, EventArgs e)
		{
			DependencyService.Get().SetTextToClipBoard("コピーするテキスト");
		}
	}
}