Ustaw fokus na pole tekstowe w WPF


105

Jak ustawić fokus na TextBoxelemencie w WPF

Mam ten kod:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

... ale to nie działa.

Dowolny pomysł?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); to działa, ale tak jest.
MindRoasterMir

Odpowiedzi:


146

W XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
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>
WPFKK

@ user841612, sprawdź poniższe łącze i sprawdź zestawienie i przestrzeń nazw msdn.microsoft.com/en-us/library/ ...
przydatneBee

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:

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
logicznie prawda, po zbyt wielu zmaganiach ta odpowiedź jest całkiem dobra i idealna jako rozwiązanie.
shivani

to działało dla mnie. zaakceptowana odpowiedź nie. Dzięki
BoundForGlory

nie jestem pewien, czy jest to specyficzne dla wersji, ale Focus()wymaga parametru stanu skupienia - np.txtCompanyId.Focus(FocusState.Keyboard)
Dan


26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

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.


19

Spróbuj tego : MyTextBox.Focus ( );


2
To najbardziej elegancka odpowiedź i nie wymaga również określania rodzica. Dzięki za to, dla mnie działa świetnie!
dbeachy1

Odpowiedź Petera Hubera robi to, ale wyjaśnia, że ​​okno musi zostać najpierw załadowane, dlatego moje nie działało
Adriaan Davel

14

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”:

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

W mojej definicji siatki:

<Grid Style="{StaticResource FocusTextBox}" />

3
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.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

Z tego, co rozumiem, inne rozwiązania mogą nie działać, ponieważ wywołanie Focus()jest wywoływane, zanim aplikacja wyrenderuje inne składniki.


3
Ta odpowiedź zasługuje na lepszą rangę.
Simon Mourier

0

Innym możliwym rozwiązaniem jest użycie FocusBehavior dostarczonego przez darmowy DevExpress MVVM Framework :

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

Umożliwia skupienie się na kontrolce, gdy jest ładowana, gdy określone zdarzenie zostanie zgłoszone lub właściwość zostanie zmieniona.


0

W kodzie z tyłu możesz to osiągnąć tylko robiąc to.

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

Uwaga: to nie zadziała przed załadowaniem okna

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.