【问题标题】:How do you allow users to copy and paste from an Xamarin.Forms label您如何允许用户从 Xamarin.Forms 标签复制和粘贴
【发布时间】:2018-07-25 17:25:33
【问题描述】:

如何允许用户从 Xamarin.Forms 标签复制和粘贴?

在任何平台上单击文本默认设置不允许突出显示,因此不允许复制和粘贴。

任何帮助将不胜感激。

【问题讨论】:

  • 我还希望允许用户从 Xamarin.Forms 标签复制和粘贴。我没有在 Xamarin.Forms 中找到任何剪贴板管理器,如 android。如果有这方面的教程,请指导。
  • 到目前为止没有任何帮助。这不可能使用 Xamarin.Forms 吗?
  • 我从未追踪过它,并放弃了,因为它对我们来说不是一个超级重要的功能。

标签: xamarin xamarin.forms


【解决方案1】:

您可以做的就是将您的标签包裹在手势识别器中:

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

这将触发您的功能,在该功能中您可以访问剪贴板并复制和粘贴。但是我一直无法找到一种简单的方法来访问 Xamarin.Forms 中的剪贴板,因此您必须使用依赖项服务。

Xamarin.Forms Dependency service documentation

这是我访问剪贴板数据的方式。请注意,在我的项目中,我只需要从剪贴板中获取数据,因此此代码仅向您展示如何访问剪贴板数据:

  1. 在你的 X.F 项目中创建一个接口,例如:

        public interface IClipBoard
        {
            String GetTextFromClipBoard();
        }
    
  2. 在您的移动项目中实现界面:

    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 应该适用于所有目标平台,在我的例子中是AndroidiOS

    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 即可触发点击事件。

    P.S.:剪贴板服务现在作为 Xamarin.Essentials 包的一部分提供,因此无需自己编写

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多