Jeśli zadzwonię SelectAll
z GotFocus
obsługi zdarzeń, to nie działa za pomocą myszki - wybór znika tak szybko, jak myszy jest zwolniony.
EDYCJA: Ludziom podoba się odpowiedź Donnelle, postaram się wyjaśnić, dlaczego nie podobała mi się tak bardzo, jak zaakceptowana odpowiedź.
- Jest to bardziej złożone, a zaakceptowana odpowiedź robi to samo w prostszy sposób.
- Przydatność zaakceptowanej odpowiedzi jest lepsza. Kiedy klikniesz w środku tekstu, tekst zostaje odznaczony po zwolnieniu myszy, co pozwala na natychmiastowe rozpoczęcie edycji, a jeśli nadal chcesz zaznaczyć wszystko, po prostu naciśnij ponownie przycisk, a tym razem nie zostanie odznaczony po zwolnieniu. Zgodnie z przepisem Donelle, jeśli kliknę w środku tekstu, muszę kliknąć drugi raz, aby móc edytować. Jeśli kliknę gdzieś w tekście na zewnątrz tekstu, najprawdopodobniej oznacza to, że chcę rozpocząć edycję zamiast nadpisywania wszystkiego.
.net
wpf
silverlight
textbox
Siergiej Aldoukhov
źródło
źródło
Odpowiedzi:
Nie wiem, dlaczego traci wybór w
GotFocus
wydarzeniu.Ale jednym z rozwiązań jest dokonanie wyboru
GotKeyboardFocus
iGotMouseCapture
wydarzeń. W ten sposób zawsze będzie działać.źródło
Mamy to, więc pierwsze kliknięcie wybiera wszystko, a kolejne kliknięcie przechodzi do kursora (nasza aplikacja jest przeznaczona do użytku na tabletach z długopisami).
Może ci się przydać.
źródło
SelectAllText
metodzietextBox.IsFocused
poprawienia go. Nie chcesz wybierać wszystkiego, gdyGetKeyboardFocus
wynika to z wciśnięcia klawisza Alt w programie.Odpowiedź Donnelle'a działa najlepiej, ale konieczność uzyskania nowej klasy, aby z niej skorzystać, to ból.
Zamiast tego rejestruję programy obsługi w App.xaml.cs dla wszystkich pól tekstowych w aplikacji. To pozwala mi używać odpowiedzi Donnelle'a ze standardową kontrolką TextBox.
Dodaj następujące metody do pliku App.xaml.cs:
źródło
To dość stare, ale i tak wyświetlę moją odpowiedź.
Wybrałem część odpowiedzi Donnelle (pominąłem podwójne kliknięcie), ponieważ uważam, że jest to bardziej naturalne. Jednak, podobnie jak gcores, nie lubię potrzeby tworzenia klasy pochodnej. Ale nie lubię też
OnStartup
metody gcores . Potrzebuję tego na zasadzie „ogólnie, ale nie zawsze”.Zaimplementowałem to jako załącznik,
DependencyProperty
dzięki czemu mogę ustawićlocal:SelectTextOnFocus.Active = "True"
w xaml. Najbardziej podoba mi się ten sposób.Dla mojej funkcji „ogólnej, ale nie zawsze” ustawiłem tę właściwość Attache na
True
(globalną)TextBox
Style
. W ten sposób „zaznaczanie tekstu” jest zawsze „włączone”, ale mogę je wyłączyć dla poszczególnych pól tekstowych.źródło
Oto zachowania mieszania implementujące rozwiązanie odpowiedzi dla Twojej wygody:
Jeden do dołączania do pojedynczego TextBox:
I jeden do dołączenia do katalogu głównego kontenera zawierającego wiele TextBoxów:
źródło
Chociaż jest to stare pytanie, właśnie miałem ten problem, ale rozwiązałem go za pomocą zachowania związanego z przywiązaniem, a nie zachowania wyrażania, jak w odpowiedzi Siergieja. Oznacza to, że nie potrzebuję zależności
System.Windows.Interactivity
w Blend SDK:Następnie możesz użyć go w swojej XAML w następujący sposób:
Napisałem o tym tutaj blog .
źródło
Oto bardzo dobre bardzo proste rozwiązanie na MSDN :
Oto kod za:
źródło
Myślę, że to działa dobrze:
Jeśli chcesz zaimplementować go jako metodę rozszerzenia:
A w twoim
GotFocus
przypadku:Odkryłem powyższe rozwiązanie, ponieważ kilka miesięcy temu szukałem sposobu na skupienie się na danym
UIElement
. Odkryłem gdzieś kod poniżej (tutaj kredyt) i działa dobrze. Publikuję go, mimo że nie jest to bezpośrednio związane z pytaniem PO, ponieważ pokazuje ten sam wzorzec używaniaDispatcher
do pracy zUIElement
.źródło
Oto próba rozwiązania niektórych problemów z innymi rozwiązaniami:
Kod, który napisałem, jest konfigurowalny. Można wybrać na jakie działania zaznaczyć cały zachowanie powinno nastąpić poprzez ustawienie trzech tylko do odczytu pola:
SelectOnKeybourdFocus
,SelectOnMouseLeftClick
,SelectOnMouseRightClick
.Minusem tego rozwiązania jest to, że jest ono bardziej złożone, a stan statyczny jest przechowywany. Wygląda to na brzydką walkę z domyślnym zachowaniem
TextBox
kontroli. Nadal działa, a cały kod jest ukryty w klasie kontenera Attached Property.Aby dołączyć właściwość Attached do a
TextBox
, wystarczy dodać przestrzeń nazw xml (xmlns
) właściwości Attached, a następnie użyć jej w następujący sposób:Kilka uwag na temat tego rozwiązania:
TextBox
pamięta swój wybór po tym, jak stracił koncentrację. Właściwie zastąpiłem to zachowanie.TextBox
(FirstActionIsMouseDown
polu statycznym).ContextMenu
pole statyczne).Jedynym efektem ubocznym, który znalazłem, jest to, kiedy
SelectOnMouseRightClick
jest prawdziwe. Czasami menu kontekstowe kliknięcia prawym przyciskiem miga, gdy jest otwarte, a kliknięcie prawym przyciskiem myszy pustego miejscaTextBox
nie powoduje „zaznaczenia wszystkiego”.źródło
Nie znalazłem żadnej z odpowiedzi tutaj naśladujących standardowy tekstowy Windows. Na przykład spróbuj kliknąć biały znak między ostatnim znakiem pola tekstowego a prawą stroną pola tekstowego. Większość rozwiązań tutaj zawsze wybierze całą treść, co bardzo utrudnia dołączenie tekstu do pola tekstowego.
Odpowiedź, którą tu przedstawiam, zachowuje się lepiej pod tym względem. Jest to zachowanie (więc wymaga zestawu System.Windows.Interactivity z Blend SDK ). Można go przepisać również przy użyciu dołączonych właściwości.
Jest to oparte na kodzie, który tu znalazłem .
źródło
Ta prosta implementacja działa dla mnie idealnie:
Aby zastosować go do wszystkich
TextBox
, wstaw następujący kod poInitializeComponent();
źródło
W pliku App.xaml:
W pliku App.xaml.cs:
Dzięki temu kodowi osiągniesz wszystko
TextBox
w swojej aplikacji.źródło
Zaczerpnięte stąd :
Zarejestruj globalną procedurę obsługi zdarzeń w pliku App.xaml.cs:
Zatem program obsługi jest tak prosty jak:
źródło
Zdaję sobie sprawę, że to bardzo stare, ale oto moje rozwiązanie oparte na interaktywności wyrażeń / microsoft i przestrzeni nazw interakcji.
Najpierw postępowałem zgodnie z instrukcjami pod tym linkiem, aby umieścić wyzwalacze interaktywne w stylu.
Sprowadza się to do tego
i to
W moim przypadku mam kontrolę użytkownika, gdzie pola tekstowe mają kod. Kod-back ma funkcję handlera. Nadałem mojej kontroli nazwę w XAML i używam tej nazwy dla elementu. To działa idealnie dla mnie. Po prostu zastosuj styl w dowolnym
TextBox
miejscu, w którym chcesz zaznaczyć cały tekst po kliknięciu wTextBox
.Pierwszy
CallMethodAction
wywołujeSelectAll
metodę pola tekstowego, gdyGotKeyboardFocus
zdarzenie jestTextBox
uruchamiane.Mam nadzieję, że to pomoże.
źródło
Użyłem odpowiedzi Nilsa, ale zmieniłem na bardziej elastyczny.
W XAML możesz użyć jednego z tych:
źródło
Oto wersja C # odpowiedzi opublikowanej przez @Nasenbaer
mając na uwadze,
MyTextBox_GotFocus
że procedura obsługi zdarzeń jest przypisana doGotFocus
zdarzeniaMyTextBox
.źródło
Mam na to nieco uproszczoną odpowiedź (tylko z
PreviewMouseLeftButtonDown
wydarzeniem), która wydaje się naśladować zwykłą funkcjonalność przeglądarki:W XAML masz do
TextBox
powiedzenia:W codebehind:
źródło
Wypróbuj tę metodę rozszerzenia, aby dodać pożądane zachowanie do dowolnej kontrolki TextBox. Jeszcze go nie testowałem, ale wydaje się, że spełnia moje potrzeby.
źródło
Dużo szukałem rozwiązania, znalazłem kilka rozwiązań, aby wybrać wszystkie Ale problem polega na tym, że po kliknięciu prawym przyciskiem myszy i wycięciu / skopiowaniu po zaznaczeniu części tekstu z pola tekstowego zaznacza się wszystko, nawet ja zaznaczyłem część tekstu. Aby to naprawić, oto rozwiązanie. Wystarczy dodać poniższy kod w zdarzeniu Wybierz na klawiaturze. To zadziałało dla mnie.
źródło
Miałem ten sam problem. W VB.Net działa to w ten sposób łatwo:
VB XAML:
Codehind:
C # (dzięki ViRuSTriNiTy)
źródło
To zdecydowanie najprostsze rozwiązanie.
Dodaj globalny moduł obsługi do aplikacji (App.xaml.cs) i gotowe. Będziesz potrzebował tylko kilku wierszy kodu.
Dlatego użyj klasy EventManager, aby zarejestrować globalną procedurę obsługi zdarzeń dla typu (TextBox). Rzeczywisty moduł obsługi jest bardzo prosty:
Sprawdź tutaj: WPF TextBox SelectAll on Focus
Mam nadzieję, że to pomoże.
źródło
Dla osób zainteresowanych podejściem Donnelle / Groky, ale chcących kliknąć znak po prawej stronie ostatniego znaku (ale nadal wewnątrz
TextBox
), aby umieścić kursor na końcu wprowadzonego tekstu, opracowałem następujące rozwiązanie:GetRoundedCharacterIndexFromPoint
Metoda została podjęta z tego postu.źródło
Po googlowaniu i testowaniu znalazłem proste rozwiązanie, które działało dla mnie.
Musisz dodać moduł obsługi zdarzeń do
Loaded
zdarzenia w oknie kontenera:Następnie musisz utworzyć moduł obsługi do odwołania
RoutedEventHandler
w poprzednim kodzie:Teraz możesz dodać
SelectAll()
polecenie wGotFocus
modułach obsługi zdarzeń do dowolnychTextBox
elementów sterujących osobno:Twój tekst jest teraz zaznaczony!
Zaadaptowano z rozwiązania Dr. WPF, Fora MSDN
źródło
źródło
Wydaje mi się, że to działa dobrze. Jest to w zasadzie podsumowanie niektórych wcześniejszych postów. Właśnie włożyłem to do mojego pliku MainWindow.xaml.cs w konstruktorze. Tworzę dwa moduły obsługi, jeden dla klawiatury i jeden dla myszy, i łączę oba zdarzenia w tej samej funkcji
HandleGotFocusEvent
, która jest zdefiniowana zaraz za konstruktorem w tym samym pliku.źródło
Prostym sposobem na przesłonięcie mouseDown i zaznaczenie wszystkich po podwójnym kliknięciu jest:
źródło
Spróbuj wstawić to do konstruktora dowolnego formantu zawierającego twoje pole tekstowe:
źródło
Jeśli zdarzenie usuwa zaznaczenie tekstu podczas
OnFocus
poruszania myszą, zwykle po prostu opóźniam zaznaczenie wszystkich.źródło
Przetestowałem je wszystkie, ale tylko następujące działały:
źródło
GetType().Name
zamiastis
lubas
jest dośćWidzę, że jest wiele odpowiedzi, ale jako zatwierdzona metoda, którą należy zastosować, jest
EditTextBoxGotCapture
z następującym kodem za:
źródło