Wenn ich SelectAll
von einem GotFocus
Ereignishandler aus anrufe, funktioniert dies nicht mit der Maus - die Auswahl verschwindet, sobald die Maus losgelassen wird.
EDIT: Die Leute mögen Donnelles Antwort, ich werde versuchen zu erklären, warum es mir nicht so gut gefallen hat wie die akzeptierte Antwort.
- Es ist komplexer, während die akzeptierte Antwort auf einfachere Weise dasselbe tut.
- Die Verwendbarkeit der akzeptierten Antwort ist besser. Wenn Sie in die Mitte des Textes klicken, wird der Text beim Loslassen der Maus abgewählt, sodass Sie sofort mit der Bearbeitung beginnen können. Wenn Sie dennoch alle auswählen möchten, drücken Sie einfach die Taste erneut. Diesmal wird die Auswahl beim Loslassen nicht aufgehoben. Wenn ich nach Donelles Rezept in die Mitte des Textes klicke, muss ich das zweite Mal klicken, um ihn bearbeiten zu können. Wenn ich irgendwo innerhalb des Textes oder außerhalb des Textes klicke, bedeutet dies höchstwahrscheinlich, dass ich mit der Bearbeitung beginnen möchte, anstatt alles zu überschreiben.
.net
wpf
silverlight
textbox
Sergey Aldoukhov
quelle
quelle
Antworten:
Ich weiß nicht, warum die Auswahl im
GotFocus
Ereignis verloren geht.Eine Lösung besteht jedoch darin, die Auswahl für die
GotKeyboardFocus
und dieGotMouseCapture
Ereignisse vorzunehmen. Auf diese Weise wird es immer funktionieren.quelle
Wir haben es so, dass der erste Klick alle auswählt und ein weiterer Klick zum Cursor geht (unsere Anwendung ist für die Verwendung auf Tablets mit Stiften konzipiert).
Vielleicht finden Sie es nützlich.
quelle
SelectAllText
Methode estextBox.IsFocused
verbessert. Sie möchten nicht alle auswählen, wenn diesGetKeyboardFocus
auf Alt-Tabs im Programm zurückzuführen ist.Donnelles Antwort funktioniert am besten, aber eine neue Klasse ableiten zu müssen, um sie zu verwenden, ist ein Schmerz.
Stattdessen registriere ich Handler, die Handler in App.xaml.cs für alle TextBoxen in der Anwendung. Dadurch kann ich die Antwort eines Donnelle mit dem Standard-TextBox-Steuerelement verwenden.
Fügen Sie Ihrer App.xaml.cs die folgenden Methoden hinzu:
quelle
Das ist ziemlich alt, aber ich werde trotzdem meine Antwort anzeigen.
Ich habe einen Teil von Donnelles Antwort ausgewählt (den Doppelklick übersprungen), weil ich dies für natürlicher halte. Wie bei gcores mag ich es jedoch nicht, eine abgeleitete Klasse zu erstellen. Aber ich mag auch keine Gcores-
OnStartup
Methode. Und das brauche ich "allgemein aber nicht immer".Ich habe dies als Anhang implementiert,
DependencyProperty
damit ich eslocal:SelectTextOnFocus.Active = "True"
in xaml einstellen kann. Ich finde diesen Weg am angenehmsten.Für meine Funktion "Allgemein, aber nicht immer" habe ich diese Attache-Eigenschaft
True
in a (global) festgelegtTextBox
Style
. Auf diese Weise ist "Auswählen des Textes" immer "Ein", aber ich kann ihn pro Textfeld deaktivieren.quelle
Hier sind die Verhaltensweisen von Blend, die die Antwortlösung für Ihre Bequemlichkeit implementieren:
Eine zum Anhängen an eine einzelne TextBox:
Und eine zum Anhängen an das Stammverzeichnis eines Containers mit mehreren TextBoxen:
quelle
Obwohl dies eine alte Frage ist, hatte ich dieses Problem gerade, löste es jedoch mit einem angehängten Verhalten und nicht mit einem Ausdrucksverhalten wie in Sergeys Antwort. Dies bedeutet, dass ich
System.Windows.Interactivity
im Blend SDK keine Abhängigkeit von Folgendes benötige :Sie können es dann wie folgt in Ihrer XAML verwenden:
Ich darüber gebloggt hier .
quelle
Hier ist eine sehr gute, sehr einfache Lösung für MSDN :
Hier ist der Code dahinter:
quelle
Ich denke das funktioniert gut:
Wenn Sie es als Erweiterungsmethode implementieren möchten:
Und in Ihrer
GotFocus
Veranstaltung:Ich habe die obige Lösung entdeckt, weil ich vor einigen Monaten nach einer Möglichkeit gesucht habe, den Fokus auf eine bestimmte zu legen
UIElement
. Ich habe den folgenden Code irgendwo entdeckt (hiermit wird eine Gutschrift erteilt) und er funktioniert gut. Ich poste es, obwohl es nicht direkt mit der Frage des OP zusammenhängt, weil es das gleiche Muster für dieDispatcher
Arbeit mit a zeigtUIElement
.quelle
Hier ist ein Versuch, einige der Probleme mit anderen Lösungen zu lösen:
Der Code, den ich geschrieben habe, ist konfigurierbar. Sie können wählen , welche Aktionen das ganze Verhalten auswählen , indem Sie drei Nur - Lese - Felder auftreten sollte:
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.Der Nachteil dieser Lösung ist, dass sie komplexer ist und der statische Zustand gespeichert wird. Es scheint ein hässlicher Kampf mit dem Standardverhalten der
TextBox
Kontrolle zu sein. Trotzdem funktioniert es und der gesamte Code ist in der Containerklasse Attached Property versteckt.Um die angehängte Eigenschaft an a
TextBox
anzuhängen, müssen Sie lediglich den XML-Namespace (xmlns
) der angehängten Eigenschaft hinzufügen und dann wie folgt verwenden:Einige Hinweise zu dieser Lösung:
TextBox
an seine Auswahl erinnert, nachdem es den Fokus verloren hat. Ich habe dieses Verhalten tatsächlich überschrieben.TextBox
(FirstActionIsMouseDown
statischen Feld) ist.ContextMenu
statisches Feld).Der einzige Nebeneffekt, den ich gefunden habe, ist, wann er
SelectOnMouseRightClick
wahr ist. Manchmal flackert das Kontextmenü mit der rechten Maustaste, wenn es geöffnet wird, und wenn Sie mit der rechten Maustaste auf ein Leerzeichen klicken,TextBox
wird nicht "Alle auswählen" angezeigt.quelle
Ich habe festgestellt, dass keine der hier dargestellten Antworten ein Standard-Windows-Textfeld imitiert. Versuchen Sie beispielsweise, in den Leerraum zwischen dem letzten Zeichen des Textfelds und der rechten Seite des Textfelds zu klicken. Die meisten Lösungen hier wählen immer den gesamten Inhalt aus, was es sehr schwierig macht, Text an ein Textfeld anzuhängen.
Die Antwort, die ich hier präsentiere, verhält sich in dieser Hinsicht besser. Es handelt sich um ein Verhalten (daher ist die Assembly System.Windows.Interactivity aus dem Blend SDK erforderlich ). Es kann auch mit angehängten Eigenschaften neu geschrieben werden.
Dies basiert auf Code, den ich hier gefunden habe .
quelle
Diese einfache Implementierung funktioniert perfekt für mich:
Um es auf alle anzuwenden, geben Sie
TextBox
den folgenden Code einInitializeComponent();
quelle
In der App.xaml-Datei:
In der Datei App.xaml.cs:
Mit diesem Code erreichen Sie alle
TextBox
in Ihrer Anwendung.quelle
Von hier genommen :
Registrieren Sie den globalen Ereignishandler in der Datei App.xaml.cs:
Dann ist der Handler so einfach wie:
quelle
Mir ist klar, dass dies sehr alt ist, aber hier ist meine Lösung, die auf den Ausdrücken / Microsoft-Interaktivität und den Namensräumen für Interaktionen basiert.
Zuerst habe ich die Anweisungen unter diesem Link befolgt , um Interaktivitätsauslöser in einen Stil einzufügen.
Dann kommt es darauf an
und das
In meinem Fall habe ich ein Benutzersteuerelement, bei dem sich die Textfelder mit einem Code-Behind befinden. Der CodeBehind hat die Handlerfunktion. Ich habe meinem Benutzersteuerelement in XAML einen Namen gegeben und verwende diesen Namen für das Element. Das funktioniert perfekt für mich. Wenden Sie den Stil einfach auf eine beliebige Stelle
TextBox
an, an der der gesamte Text ausgewählt werden soll, wenn Sie auf klickenTextBox
.Der erste
CallMethodAction
ruft dieSelectAll
Methode des Textfelds auf , wenn dasGotKeyboardFocus
EreignisTextBox
ausgelöst wird.Ich hoffe das hilft.
quelle
Ich habe Nils 'Antwort verwendet, aber auf flexibler umgestellt.
In XAML können Sie Folgendes verwenden:
quelle
Hier ist die C # -Version der Antwort von @Nasenbaer
wohingegen
MyTextBox_GotFocus
der Ereignishandler demGotFocus
Ereignis von zugeordnet istMyTextBox
.quelle
Ich habe eine leicht vereinfachte Antwort darauf (mit nur dem
PreviewMouseLeftButtonDown
Ereignis), die die übliche Funktionalität eines Browsers zu imitieren scheint:In XAML haben Sie ein
TextBox
Mitspracherecht:Im Codebehind:
quelle
Versuchen Sie diese Erweiterungsmethode, um jedem TextBox-Steuerelement das gewünschte Verhalten hinzuzufügen. Ich habe es noch nicht ausgiebig getestet, aber es scheint meine Bedürfnisse zu erfüllen.
quelle
Ich habe viel nach der Lösung gesucht und einige Lösungen gefunden, um sie auszuwählen. Das Problem ist jedoch, dass wir, wenn wir mit der rechten Maustaste klicken und nach Auswahl eines Textteils aus dem Textfeld ausschneiden / kopieren, alle auswählen, auch wenn ich einen Textteil ausgewählt habe. Um dies hier zu beheben, ist die Lösung. Fügen Sie einfach den folgenden Code in das Tastaturauswahlereignis ein. Das hat bei mir funktioniert.
quelle
Ich hatte das gleiche Problem. In VB.Net funktioniert das ganz einfach:
VB XAML:
Codehind:
C # (danke an ViRuSTriNiTy)
quelle
Dies ist bei weitem die einfachste Lösung.
Fügen Sie der Anwendung (App.xaml.cs) einen globalen Handler hinzu und fertig. Sie benötigen nur wenige Codezeilen.
Verwenden Sie daher die EventManager-Klasse, um einen globalen Ereignishandler für einen Typ (TextBox) zu registrieren. Der eigentliche Handler ist ganz einfach:
Überprüfen Sie hier: WPF TextBox SelectAll on Focus
Ich hoffe es hilft.
quelle
Für diejenigen, die an Donnelles / Grokys Ansatz interessiert sind, aber einen Klick rechts neben dem letzten Zeichen (aber immer noch innerhalb
TextBox
) wünschen , um das Caret am Ende des eingegebenen Textes zu platzieren, habe ich folgende Lösung gefunden:Die
GetRoundedCharacterIndexFromPoint
Methode wurde aus diesem Beitrag übernommen.quelle
Nach dem Googeln und Testen habe ich eine einfache Lösung gefunden, die für mich funktioniert hat.
Sie müssen dem
Loaded
Ereignis Ihres Containerfensters einen Ereignishandler hinzufügen :Als Nächstes müssen Sie den Handler für den
RoutedEventHandler
im vorherigen Code angegebenen Code erstellen:Jetzt können Sie den
SelectAll()
Befehl fürGotFocus
Ereignishandler zu allenTextBox
Steuerelementen separat hinzufügen :Ihr Text wird jetzt im Fokus ausgewählt!
Adaptiert von Dr. WPF-Lösung, MSDN-Foren
quelle
quelle
Das scheint für mich gut zu funktionieren. Es ist im Grunde eine Zusammenfassung einiger früherer Beiträge. Ich habe dies einfach in meine MainWindow.xaml.cs-Datei im Konstruktor eingefügt. Ich erstelle zwei Handler, einen für die Tastatur und einen für die Maus, und führe beide Ereignisse in dieselbe Funktion
HandleGotFocusEvent
, die direkt nach dem Konstruktor in derselben Datei definiert ist.quelle
Eine einfache Möglichkeit, den mouseDown zu überschreiben und alle nach einem Doppelklick auszuwählen, ist:
quelle
Versuchen Sie, dies in den Konstruktor des Steuerelements einzufügen, in dem sich Ihr Textfeld befindet:
quelle
Wenn es ein Ereignis gibt, bei dem
OnFocus
die Auswahl von Text während der Maus aufgehoben wird, verzögere ich normalerweise nur die Auswahl aller.quelle
Ich habe alle getestet, aber nur Folgendes hat funktioniert:
quelle
GetType().Name
anstelle vonis
oderas
ist ziemlich hackyIch sehe, dass es viele Antworten gibt, aber als genehmigte sollten folgende Methoden angewendet werden
EditTextBoxGotCapture
mit folgendem Code dahinter:
quelle