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ł?

priyanka.sarkar
źródło
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>
przydatne
źródło
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();
  }
}
Peter Huber
źródło
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
50

wypróbuj FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Arsen Mkrtchyan
źródło
5
Co się stanie, jeśli element, na którym chcesz ustawić fokus, jest elementem nadrzędnym oO?
Brock Hensley
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
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.

Svetlozar Angelov
źródło
19

Spróbuj tego : MyTextBox.Focus ( );

NazOok
źródło
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}" />
Anya Hope
źródło
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.

anemomylos
źródło
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.

Alex Russkov
źródło
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

MindRoasterMir
źródło