Imposta lo stato attivo sulla casella di testo in WPF


105

Come impostare lo stato attivo su un TextBoxelemento in WPF

Ho questo codice:

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

...ma non sta funzionando.

Qualche idea?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); funziona ma è così.
MindRoasterMir

Risposte:


145

In XAML:

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

9
Preferisco questo approccio agli altri sopra poiché è in linea con MVVM.
Todd Sprang

1
L'elemento focalizzato è corretto in sola lettura Come puoi impostare in xaml? L'ho usato e non ha funzionato <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612, controllare il seguente link e verificare il montaggio e Namespace msdn.microsoft.com/en-us/library/...
usefulBee

Funziona solo una volta. Se si desidera modificare lo stato attivo dopo che la pagina è stata creata, è necessario farlo a livello di codice.
Joe Steele

anche questo funziona. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

Nessuno ha spiegato finora perché il codice nella domanda non funziona. La mia ipotesi è che il codice sia stato inserito nel costruttore della finestra. Ma in questo momento è troppo presto per mettere a fuoco. Deve essere fatto una volta che la finestra è pronta per l'interazione. Il posto migliore per il codice è l'evento Loaded:

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

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

1
logicamente vero, dopo troppe lotte questa risposta è abbastanza buona e perfetta come soluzione.
shivani

questo ha funzionato per me. la risposta accettata no. Grazie
BoundForGlory

non sono sicuro se la versione è specifica, ma Focus()richiede il parametro dello stato di messa a fuoco - ad esempiotxtCompanyId.Focus(FocusState.Keyboard)
Dan


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

MSDN:

Può esserci un solo elemento sull'intero desktop con lo stato attivo della tastiera. In WPF, l'elemento con lo stato attivo della tastiera avrà IsKeyboardFocused impostato su true.

Potresti interrompere dopo la linea di impostazione e controllare il valore della IsKeyboardFocusedproprietà. Controlla anche se hai davvero raggiunto quella linea o forse hai impostato qualche altro elemento per concentrarti dopo.


19

Prova questo : MyTextBox.Focus ( );


2
Questa è la risposta più elegante e non richiede di specificare anche il genitore. Grazie per questo, funziona benissimo per me!
dbeachy1

La risposta di Peter Huber fa questo ma spiega che la finestra deve essere caricata prima, motivo per cui la mia non funzionava
Adriaan Davel

14

Niente di tutto questo ha funzionato per me poiché stavo usando una griglia piuttosto che uno StackPanel.

Finalmente ho trovato questo esempio: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

e modificato in questo:

Nella sezione "Risorse":

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

Nella mia definizione di griglia:

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

2
Questo ha funzionato anche per me. Il resto non lo era. Grazie per il collegamento, è stato piuttosto interessante. Interessante anche il fatto che una cosa così semplice possa essere così complicata.
TravisWhidden

2
La risposta di cui sopra funziona bene indipendentemente dal fatto che il contenitore sia un Gird o uno StackPanel. Poiché la struttura della griglia non è chiara, è difficile dire cosa potrebbe essere andato storto. Bello vedere alternative però.
Bee

1
Per me, questo è anche l'unico a funzionare correttamente. Bel modo.
OregonGhost

7

Nel caso in cui non hai trovato la soluzione nelle altre risposte, è così che ho risolto il problema.

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

Da quello che ho capito le altre soluzioni potrebbero non funzionare perché la chiamata a Focus()viene invocata prima che l'applicazione abbia eseguito il rendering degli altri componenti.


3
Questa risposta merita un rango migliore.
Simon Mourier

0

Un'altra possibile soluzione è utilizzare FocusBehavior fornito da DevExpress MVVM Framework gratuito :

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

Consente di mettere a fuoco un controllo quando viene caricato, quando viene generato un determinato evento o viene modificata una proprietà.


0

In Code behind puoi ottenerlo solo in questo modo.

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

Nota: non funzionerà prima che la finestra venga caricata

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.