2016-06-07 6 views
1

Ich arbeite copy/paste Option Menüs zur Deaktivierung auf Xamarin Entry bildet, ich bin in der Lage Kopieroption mit IsPassword = true Attribute aber dieses Attribut auch wandelt die normal deaktivieren Eingabefeld in Passwortfeld, das ist keine Voraussetzung.Deaktivieren Kopieren/Einfügen auf Xamarin bildet Eingabefeld dh Eintrag

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

Vielen Dank im Voraus.

Antwort

3

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.

+0

Klingt gut. Aber ich brauche es auch für Android – Pehlaj

+0

Ich habe einige Sprungpunkte für Android hinzugefügt. – Paul

0

Konnte keine Arbeitsbeispiele finden. wird geschlossen, wenn bis zum Ablauf der Bounty keine Antwort eingegangen ist.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/12899331) – Joe

Verwandte Themen