Як встановити фокус на 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>
Поки ніхто не пояснив, чому код у питанні не працює. Я здогадуюсь, що код був розміщений у конструкторі Вікна. Але в цей час ще зарано ставити фокус. Це потрібно зробити, як тільки Вікно готове до взаємодії. Найкраще місце для коду - подія 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();
}
Примітка. Він не буде працювати перед завантаженням вікна