Wolę to podejście od innych powyżej, ponieważ jest zgodne z MVVM.
Todd Sprang
1
Skupiony element ma prawo tylko do odczytu Jak można ustawić w XAML? Użyłem tego i nie zadziałało <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
Działa to tylko raz. Jeśli chcesz zmienić fokus po zbudowaniu strony, musisz to zrobić programowo.
Joe Steele
to też działa. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir
51
Nikt dotąd nie wyjaśnił, dlaczego kod w pytaniu nie działa. Domyślam się, że kod został umieszczony w konstruktorze Window. Ale w tej chwili jest za wcześnie, aby skupić się na tym. Należy to zrobić, gdy okno jest gotowe do interakcji. Najlepszym miejscem na kod jest zdarzenie Loaded:
Na całym pulpicie może znajdować się tylko jeden element, który ma fokus klawiatury. W WPF element, który ma fokus klawiatury, będzie miał IsKeyboardFocused ustawiony na true.
Możesz złamać linię ustawień i sprawdzić wartość IsKeyboardFocusedwłaściwości. Sprawdź również, czy naprawdę osiągasz tę linię, czy może ustawiłeś jakiś inny element, aby uzyskać fokus po tym.
To zadziałało również dla mnie. Reszta nie była. Dzięki za link, to było całkiem interesujące. Ciekawe też, że taka prosta rzecz może być tak skomplikowana.
TravisWhidden
2
Powyższa odpowiedź działa dobrze, niezależnie od tego, czy kontener to Gird czy StackPanel. Ponieważ struktura twojej siatki nie jest jasna, trudno powiedzieć, co mogło się nie udać. Miło jest jednak zobaczyć alternatywy.
przydatneBee
1
Dla mnie to też jedyny, który działa poprawnie. Dobry sposób.
OregonGhost,
7
Jeśli nie znalazłeś rozwiązania w innych odpowiedziach, w ten sposób rozwiązałem problem.
Odpowiedzi:
W XAML:
źródło
Nikt dotąd nie wyjaśnił, dlaczego kod w pytaniu nie działa. Domyślam się, że kod został umieszczony w konstruktorze Window. Ale w tej chwili jest za wcześnie, aby skupić się na tym. Należy to zrobić, gdy okno jest gotowe do interakcji. Najlepszym miejscem na kod jest zdarzenie Loaded:
źródło
Focus()
wymaga parametru stanu skupienia - np.txtCompanyId.Focus(FocusState.Keyboard)
wypróbuj FocusManager.SetFocusedElement
źródło
msdn:
Możesz złamać linię ustawień i sprawdzić wartość
IsKeyboardFocused
właściwości. Sprawdź również, czy naprawdę osiągasz tę linię, czy może ustawiłeś jakiś inny element, aby uzyskać fokus po tym.źródło
Spróbuj tego :
MyTextBox.Focus ( );
źródło
Nic z tego nie działało dla mnie, ponieważ korzystałem z siatki, a nie ze StackPanel.
W końcu znalazłem ten przykład: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/
i zmodyfikował go do tego:
W sekcji „Zasoby”:
W mojej definicji siatki:
źródło
Jeśli nie znalazłeś rozwiązania w innych odpowiedziach, w ten sposób rozwiązałem problem.
Z tego, co rozumiem, inne rozwiązania mogą nie działać, ponieważ wywołanie
Focus()
jest wywoływane, zanim aplikacja wyrenderuje inne składniki.źródło
Innym możliwym rozwiązaniem jest użycie FocusBehavior dostarczonego przez darmowy DevExpress MVVM Framework :
Umożliwia skupienie się na kontrolce, gdy jest ładowana, gdy określone zdarzenie zostanie zgłoszone lub właściwość zostanie zmieniona.
źródło
W kodzie z tyłu możesz to osiągnąć tylko robiąc to.
Uwaga: to nie zadziała przed załadowaniem okna
źródło