禁用 Xamarin 表单输入字段上的复制/粘贴,即条目

Posted

技术标签:

【中文标题】禁用 Xamarin 表单输入字段上的复制/粘贴,即条目【英文标题】:Disable copy/paste on Xamarin forms input field i.e. Entry 【发布时间】:2016-10-07 15:50:34 【问题描述】:

我正在努力禁用 xamarin 表单 Entry 上的复制/粘贴选项菜单,我可以使用 IsPassword=true 属性禁用复制选项,但此属性还将普通输入字段转换为密码字段,这不是必需的。

<Entry IsPassword="true" Placeholder="Password" TextColor="Green" BackgroundColor="#2c3e50" />

提前致谢。

【问题讨论】:

【参考方案1】:

这与表单的功能有关。此处以 ios 为例,另一个答案的 Bugzilla 问题中提到的 CanPerform 覆盖将 UIMenuController 用作 withSender 而不是 UITextField 本身,否则可能会出现这种情况。这是因为 EntryRenderer 类是 ViewRenderer&lt;TView, TNativeView&gt; 类型,随后使用了 TNativeView(在本例中为 UITextView)在其 CanPerform 中的任何内容。因为默认情况下不会覆盖任何内容,所以仍然可以在 UIMenuController 中看到所有剪切/复制/粘贴选项。

因此,会有几个选项。您可以先进行修改,如果您不想复制/粘贴但可以摆脱其他所有内容,您可以在继承自 EntryRenderer 的自定义渲染器中使用 UIMenuController.SharedMenuController.SetMenuVisible(false, false)。如果您在 SO 上环顾四周,会有类似的问题,这是一条可能的路线。

或者,您可以创建一个“真正的”自定义渲染器,从 ViewRenderer&lt;TView, TNativeView&gt; 继承为 ViewRenderer&lt;Entry, YourNoCopyPasteUITextFieldClassName&gt;。然后,从 UITextField 继承的类可以覆盖 CanPerform,如下所示:

    public override bool CanPerform(Selector action, NSObject withSender)
    
        if(action.Name == "paste:" || action.Name == "copy:" || action.Name == "cut:")
            return false;

        return base.CanPerform(action, withSender);
    

这将需要更多的努力,因为自定义渲染器的行为与 EntryRenderer 不同,但由于 Xamarin.Forms 现在是开源的,您可以查看它以了解有关 EntryRenderer 如何正常工作的一些想法。 android 可能也需要做类似的事情。

编辑:对于 Android,您可能可以使用这个 SO 答案作为起点:How to disable copy/paste from/to EditText

另一个自定义渲染器,这次继承自ViewRenderer&lt;Entry, EditText&gt;,并在其中创建一个类,如下所示(以最基本的形式):

class Callback : Java.Lang.Object, ActionMode.ICallback


    public bool OnActionItemClicked(ActionMode mode, IMenuItem item)
    
        return false;
    

    public bool OnCreateActionMode(ActionMode mode, IMenu menu)
    
        return false;
    

    public void OnDestroyActionMode(ActionMode mode)
    

    

    public bool OnPrepareActionMode(ActionMode mode, IMenu menu)
    
        return false;
    

然后,在您的OnElementChanged 方法中,您可以设置本机控件和CustomSelectionActionModeCallback 值:

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    
        base.OnElementChanged(e);

        if (Control != null)
        
            Control.CustomSelectionActionModeCallback = new Callback();
        
    

就工具栏而言,执行以下操作似乎会禁用自定义条目上的所有复制/粘贴/剪切功能。但是,您仍然可以长按以显示粘贴按钮,除了将 LongClickable 设置为 false 之外,我已经对此进行了一些探索,但尚未找到答案。如果我在这方面确实发现了任何其他内容,我会确保更新此内容。

【讨论】:

@Paul 答案确实帮助了我,谢谢。不确定它是否有任何价值,但我认为有一个 CustomInsertionActionModeCallback 属性有助于禁用您在答案末尾提到的粘贴选项。

以上是关于禁用 Xamarin 表单输入字段上的复制/粘贴,即条目的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 xamarin 表单输入字段的禁用文本颜色?

Flutter Web - TextFormField 禁用复制和粘贴

Pycharm:禁用选择文本上的复制

Xamarin 表单:如何复制条目值?

用于复制和粘贴垂直列表的 Django 表单字段

如何快速禁用 SkyFloatingLabelTextField 中的复制粘贴功能?