Dies hat damit zu tun, wie Forms funktioniert. Bei Verwendung von iOS als Beispiel verwendet die CanPerform
Überschreibung, auf die im Bugzilla-Problem der anderen Antwort Bezug genommen wird, die UIMenuController
als withSender
und nicht das UITextField selbst, das andernfalls erwartet werden könnte. Dies liegt daran, dass die EntryRenderer-Klasse ein ViewRenderer<TView, TNativeView>
-Typ ist und anschließend TNativeView
(in diesem Fall UITextView
) CanPerform
verwendet. Da standardmäßig nichts außer Kraft gesetzt wird, sieht man immer noch alle Ausschneiden/Kopieren/Einfügen-Optionen in der UIMenuController
.
Als Ergebnis würde es ein paar Optionen geben. Sie könnten zuerst die Änderung vornehmen, wo Sie, wenn Sie nicht kopieren/einfügen wollen, aber gut darin sind, alles andere loszuwerden, können Sie UIMenuController.SharedMenuController.SetMenuVisible(false, false)
in einem benutzerdefinierten Renderer verwenden, der von EntryRenderer
erbt. Wenn Sie sich auf SO umsehen, gibt es ähnliche Fragen, wo dies eine mögliche Route ist.
Alternativ können Sie einen "echten" benutzerdefinierten Renderer erstellen, der von ViewRenderer<TView, TNativeView>
als ViewRenderer<Entry, YourNoCopyPasteUITextFieldClassName>
erbt. Die Klasse von UITextField vererben kann dann CanPerform
außer Kraft setzen, wie so etwas wie folgt:
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);
}
Dies wird mehr Aufwand erfordern, da die benutzerdefinierten Renderer werden nicht das gleiche Verhalten wie die EntryRenderer haben, aber als Xamarin.Forms ist jetzt Open Source, Sie können nach einigen Ideen suchen, wie der EntryRenderer normal funktioniert. Ähnliches müsste wahrscheinlich für Android gemacht werden.
bearbeiten: Für Android, können Sie wahrscheinlich verwenden, um dies SO als Ausgangspunkt zu beantworten: How to disable copy/paste from/to EditText
anderen benutzerdefinierten Renderer, diesmal von ViewRenderer<Entry, EditText>
vererben, und eine Klasse zu erstellen, in der es diese wie (in der grundlegendsten Form):
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;
}
}
Dann in Ihrem OnElementChanged
Methode können Sie die native Kontrolle und den CustomSelectionActionModeCallback
Wert gesetzt:
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.CustomSelectionActionModeCallback = new Callback();
}
}
Wenn Sie etwas wie das Folgende tun, wird die gesamte Funktion zum Kopieren/Einfügen/Ausschneiden des benutzerdefinierten Eintrags deaktiviert, sofern die Symbolleiste geöffnet wird. Sie können jedoch immer noch lange klicken, um die Paste-Schaltfläche anzuzeigen, zu der ich ein wenig herum gestochet habe, habe noch keine Antwort gefunden, die LongClickable
auf false setzt. Wenn ich etwas anderes in dieser Hinsicht finde, würde ich sicherstellen, dass dies aktualisiert wird.
Klingt gut. Aber ich brauche es auch für Android – Pehlaj
Ich habe einige Sprungpunkte für Android hinzugefügt. – Paul