禁用Xamarin表单输入字段(即Entry)上的复制/粘贴

Peh*_*laj 3 xaml xamarin.forms

我正在上禁用xamarin形式的复制/粘贴选项菜单,我能够禁止使用复制选项IsPassword =真实属性,但这种属性也将转换成正常输入字段密码字段,它不是必需的.

<Entry IsPassword="true" Placeholder="Password" TextColor="Green" BackgroundColor="#2c3e50" />
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Pau*_*aul 8

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

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

或者,您可以创建一个继承自ViewRenderer<TView, TNativeView>as 的"true"自定义渲染器ViewRenderer<Entry, YourNoCopyPasteUITextFieldClassName>.然后,继承自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);
    }
Run Code Online (Sandbox Code Playgroud)

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

编辑:对于Android,您可以使用此SO答案作为起点:如何禁用从/到EditText的复制/粘贴

另一个自定义渲染器,这次继承ViewRenderer<Entry, EditText>,并在其中创建一个类(以最基本的形式):

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

        if (Control != null)
        {
            Control.CustomSelectionActionModeCallback = new Callback();
        }
    }
Run Code Online (Sandbox Code Playgroud)

就工具栏而言,执行以下操作似乎会禁用自定义条目上的所有复制/粘贴/剪切功能.但是,您仍然可以长时间单击以显示粘贴按钮,我已经戳了一下但没有找到答案,但设置LongClickable为false.如果我在这方面找到了其他任何东西,我一定要更新.