Come impostare lo stato attivo su un TextBox
elemento in WPF
Ho questo codice:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...ma non sta funzionando.
Qualche idea?
Come impostare lo stato attivo su un TextBox
elemento in WPF
Ho questo codice:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...ma non sta funzionando.
Qualche idea?
Risposte:
In XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
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();
}
}
Focus()
richiede il parametro dello stato di messa a fuoco - ad esempiotxtCompanyId.Focus(FocusState.Keyboard)
prova FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
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 IsKeyboardFocused
proprietà. Controlla anche se hai davvero raggiunto quella linea o forse hai impostato qualche altro elemento per concentrarti dopo.
Prova questo : MyTextBox.Focus ( );
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}" />
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.
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à.
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