Jak ustawić fokus na TextBox
elemencie w WPF
Mam ten kod:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
... ale to nie działa.
Dowolny pomysł?
Jak ustawić fokus na TextBox
elemencie w WPF
Mam ten kod:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
... ale to nie działa.
Dowolny pomysł?
Odpowiedzi:
W XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
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();
}
}
Focus()
wymaga parametru stanu skupienia - np.txtCompanyId.Focus(FocusState.Keyboard)
wypróbuj FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
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ść IsKeyboardFocused
wł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.
Spróbuj tego : MyTextBox.Focus ( );
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}" />
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.
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.
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