Как установить фокус на TextBox
элементе в WPF
У меня есть такой код:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...Но это не работает.
Любая идея?
Как установить фокус на TextBox
элементе в WPF
У меня есть такой код:
txtCompanyID.Focusable = true;
txtCompanyID.Focus();
...Но это не работает.
Любая идея?
Ответы:
В XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
Пока никто не объяснил, почему код в вопросе не работает. Я предполагаю, что код был помещен в конструктор Window. Но пока рано расставлять акценты. Это нужно сделать, когда окно будет готово к взаимодействию. Лучшее место для кода - событие Loaded:
public KonsoleWindow() {
public TestWindow() {
InitializeComponent();
Loaded += TestWindow_Loaded;
}
private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
txtCompanyID.Focus();
}
}
Focus()
требуется параметр состояния фокуса - напримерtxtCompanyId.Focus(FocusState.Keyboard)
попробуйте FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);
msdn:
На всем рабочем столе может быть только один элемент с фокусом клавиатуры. В WPF для элемента с фокусом клавиатуры IsKeyboardFocused будет установлено значение true.
Вы можете прервать линию настройки и проверить значение IsKeyboardFocused
свойства. Также проверьте, действительно ли вы достигли этой линии или, возможно, вы установили какой-то другой элемент, чтобы после этого фокусироваться.
У меня ничего из этого не сработало, поскольку я использовал сетку, а не StackPanel.
Я наконец нашел этот пример: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/
и изменил его на это:
В разделе "Ресурсы":
<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>
В моем определении сетки:
<Grid Style="{StaticResource FocusTextBox}" />
Если вы не нашли решения по другим ответам, вот как я решил проблему.
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);
Насколько я понимаю, другие решения могут не работать, потому что вызов Focus()
вызывается до того, как приложение отобразит другие компоненты.
Другое возможное решение - использовать FocusBehavior, предоставляемый бесплатной DevExpress MVVM Framework :
<TextBox Text="This control is focused on startup">
<dxmvvm:Interaction.Behaviors>
<dxmvvm:FocusBehavior/>
</dxmvvm:Interaction.Behaviors>
</TextBox>
Он позволяет сфокусировать элемент управления при его загрузке, при возникновении определенного события или изменении свойства.
В коде позади вы можете добиться этого, только сделав это.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
txtIndex.Focusable = true;
txtIndex.Focus();
}
Примечание: он не будет работать до загрузки окна