Как вы разрешаете пользователям копировать и вставлять их с метки Xamarin.Forms

Как вы разрешаете пользователям копировать и вставлять их из метки Xamarin.Forms?

Нажмите на текст на любой платформе, настройки по умолчанию не позволяют выделять и, следовательно, копировать и вставлять.

Любая помощь будет оценена.

Ответ 1

Что вы можете сделать, это обернуть свою метку в распознавателе жестов:

<Label Text="Test">
    <Label.GestureRecognizers>
        <TapGestureRecognizer
            Tapped="YourFunctionToHandleMadTaps" 
            NumberOfTapsRequired="1" 
        />
   </Label.GestureRecognizers>
</Label>

Это вызовет вашу функцию и в этой функции вы сможете попасть в буфер обмена и скопировать и вставить. Однако я не смог найти простой способ доступа к буферу в Xamarin.Forms, поэтому вам нужно использовать службу зависимостей.

Документация по обслуживанию зависимостей Xamarin.Forms

Вот как я сделал доступ к данным в буфере обмена. Обратите внимание, что в моем проекте мне только нужно было записывать данные из буфера обмена, поэтому этот код просто показывает вам, как получить доступ к данным буфера обмена:

  • Создайте интерфейс в проекте X.F, например:

        public interface IClipBoard
        {
            String GetTextFromClipBoard();
        }
    
  • Внедрите интерфейс в свои мобильные проекты:

    Android:
        public string GetTextFromClipBoard ()
        {
            var clipboardmanager = (ClipboardManager)Forms.Context.GetSystemService (Context.ClipboardService);
            var item = clipboardmanager.PrimaryClip.GetItemAt(0);
            var text = item.Text;
            return text;
        }
    
    iOs:
        public string GetTextFromClipBoard ()
        {
            var pb = UIPasteboard.General.GetValue ("public.utf8-plain-text");
            return pb.ToString ();
        }
    

Не забудьте добавить биты сборки вверху:

    iOs: [assembly: Dependency (typeof (ClipBoard_iOs))]
    Android: [assembly: Dependency (typeof (ClipBoard_Droid))]
  1. Вызовите службу зависимостей от вас. Функция X.F

        public void YourFunctionToHandleMadTaps(Object sender, EventArgs ea)
        {
            var clipboardText = DependencyService.Get<IClipBoard> ().GetTextFromClipBoard ();
    
            YourFunctionToHandleMadTaps.Text = clipboardText;
        }
    

Ответ 2

Так как I_Khanage предоставил только половинное решение, я опубликую полное решение.

IClipboardService должен быть реализован для всех платформ таргетинга, в моем случае это Android и iOS:

public interface IClipboardService
{
    string GetTextFromClipboard();
    void SendTextToClipboard(string text);
}

// iOS
public class ClipboardService : IClipboardService
{
    public string GetTextFromClipboard() => UIPasteboard.General.String;
    public void SendTextToClipboard(string text) => UIPasteboard.General.String = text;
}

// Android
public class ClipboardService : IClipboardService
{
    public string GetTextFromClipboard()
    {
        var clipboardmanager = (ClipboardManager)Forms.Context.GetSystemService(Context.ClipboardService);
        var item = clipboardmanager.PrimaryClip.GetItemAt(0);
        var text = item.Text;
        return text;
    }

    public void SendTextToClipboard(string text)
    {
        // Get the Clipboard Manager
        var clipboardManager = (ClipboardManager)Forms.Context.GetSystemService(Context.ClipboardService);

        // Create a new Clip
        var clip = ClipData.NewPlainText("YOUR_TITLE_HERE", text);

        // Copy the text
        clipboardManager.PrimaryClip = clip;
    }
}

Код доступен на github.

Теперь просто добавьте GestureRecognizer, чтобы вызвать событие нажатия.