Definir o foco na caixa de texto em WPF

105

Como definir o foco em um TextBoxelemento no WPF

Eu tenho este código:

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

...Mas isto não está funcionando.

Qualquer ideia?

priyanka.sarkar
fonte
txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); funciona, mas é assim.
MindRoasterMir

Respostas:

145

Em XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>
útilBee
fonte
9
Eu prefiro essa abordagem às outras acima, pois ela segue em linha com o MVVM.
Todd Sprang
1
O elemento focado é somente leitura correto Como você pode definir no xaml? Usei isso e não funcionou <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK
@ user841612, verifique o link a seguir e verifique o Assembly e Namespace msdn.microsoft.com/en-us/library/…
helpfulBee
Isso só funciona uma vez. Se você quiser alterar o foco após a criação da página, será necessário fazê-lo programaticamente.
Joe Steele
isso também funciona. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir
51

Ninguém explicou até agora porque o código em questão não funciona. Meu palpite é que o código foi colocado no construtor da janela. Mas neste momento é muito cedo para definir o foco. Isso deve ser feito quando a janela estiver pronta para interação. O melhor lugar para o código é o evento Loaded:

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

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}
Peter Huber
fonte
1
logicamente verdade, depois de muita luta, essa resposta é muito boa e perfeita como solução.
shivani
isso funcionou para mim. a resposta aceita não. Obrigado
BoundForGlory
não tenho certeza se a versão específica, mas Focus()necessita do parâmetro foco estado - por exemplotxtCompanyId.Focus(FocusState.Keyboard)
Dan
49

experimente FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Arsen Mkrtchyan
fonte
5
E se o elemento para o qual você deseja definir o foco for o elemento pai oO?
Brock Hensley
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

Pode haver apenas um elemento em toda a área de trabalho que tem o foco do teclado. No WPF, o elemento que tem o foco do teclado terá IsKeyboardFocused definido como verdadeiro.

Você pode quebrar após a linha de configuração e verificar o valor da IsKeyboardFocusedpropriedade. Verifique também se você realmente alcançou essa linha ou talvez tenha definido algum outro elemento para obter o foco depois disso.

Svetlozar Angelov
fonte
19

Experimente isto: MyTextBox.Focus ( );

NazOok
fonte
2
Esta é a resposta mais elegante e não requer que você especifique também o pai. Obrigado por isso, funciona muito bem para mim!
dbeachy1 de
A resposta de Peter Huber faz isso, mas explica que a janela precisa ser carregada primeiro, e é por isso que a minha não estava funcionando
Adriaan Davel
14

Nada disso funcionou para mim, pois eu estava usando uma grade em vez de um StackPanel.

Finalmente encontrei este exemplo: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

e modificou para este:

Na seção 'Recursos':

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

Na minha definição de grade:

<Grid Style="{StaticResource FocusTextBox}" />
Anya Hope
fonte
2
Isso funcionou para mim também. O resto não foi. Obrigado pelo link, foi bem interessante. Também é interessante que uma coisa tão simples possa ser tão complicada.
TravisWhidden
2
A resposta acima funciona bem, independentemente se o contêiner é um Gird ou StackPanel. Como a estrutura de sua grade não é clara, é difícil dizer o que pode ter dado errado. É bom ver alternativas embora.
útilBee,
1
Para mim, este também é o único que funciona corretamente. Bom caminho.
OregonGhost
7

Caso você não tenha encontrado a solução nas outras respostas, resolvi assim o problema.

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

Pelo que entendi, as outras soluções podem não funcionar porque a chamada para Focus()é invocada antes que o aplicativo tenha renderizado os outros componentes.

anemomylos
fonte
3
Essa resposta merece uma classificação melhor.
Simon Mourier
0

Outra solução possível é usar FocusBehavior fornecido pelo DevExpress MVVM Framework gratuito :

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

Ele permite que você foque um controle quando ele é carregado, quando um determinado evento é gerado ou uma propriedade é alterada.

Alex Russkov
fonte
0

No Code behind, você só consegue fazer isso.

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

Nota: Não vai funcionar antes de a janela ser carregada

MindRoasterMir
fonte