Установить фокус на текстовое поле в WPF

105

Как установить фокус на TextBoxэлементе в WPF

У меня есть такой код:

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

...Но это не работает.

Любая идея?

приянка.саркар
источник
txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); это работает, но вот как.
MindRoasterMir

Ответы:

146

В XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>
полезный
источник
9
Я предпочитаю этот подход другим выше, так как он соответствует MVVM.
Тодд Спранг,
1
Сфокусированный элемент правильно только для чтения Как вы можете установить в xaml? Я использовал это, и это не сработало <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK
@ user841612, проверьте следующую ссылку и проверьте сборку
полезноBee
Это работает только один раз. Если вы хотите изменить фокус после того, как страница была построена, вам нужно сделать это программно.
Джо Стил
это тоже работает. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir
51

Пока никто не объяснил, почему код в вопросе не работает. Я предполагаю, что код был помещен в конструктор Window. Но пока рано расставлять акценты. Это нужно сделать, когда окно будет готово к взаимодействию. Лучшее место для кода - событие Loaded:

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

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}
Питер Хубер
источник
1
логически верно, после слишком долгой борьбы этот ответ довольно хорош и идеален в качестве решения.
shivani
это сработало для меня. принятый ответ не изменился. Спасибо
BoundForGlory
не уверен, специфична ли версия, но Focus()требуется параметр состояния фокуса - напримерtxtCompanyId.Focus(FocusState.Keyboard)
Дэн
50

попробуйте FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Арсен Мкртчян
источник
5
Что, если элемент, на который вы хотите установить фокус, является родительским элементом oO?
Брок Хенсли
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

На всем рабочем столе может быть только один элемент с фокусом клавиатуры. В WPF для элемента с фокусом клавиатуры IsKeyboardFocused будет установлено значение true.

Вы можете прервать линию настройки и проверить значение IsKeyboardFocusedсвойства. Также проверьте, действительно ли вы достигли этой линии или, возможно, вы установили какой-то другой элемент, чтобы после этого фокусироваться.

Светлозар Ангелов
источник
19

Попробуй это : MyTextBox.Focus ( );

NazOok
источник
2
Это наиболее элегантный ответ, и он не требует указания родителя. Спасибо за это, у меня отлично работает!
dbeachy1
Ответ Питера Хубера делает это, но объясняет, что сначала нужно загрузить окно, поэтому мое не работает
Адриан
14

У меня ничего из этого не сработало, поскольку я использовал сетку, а не 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}" />
Аня Надежда
источник
3
Это сработало и для меня. Остального не было. Спасибо за ссылку, было довольно интересно. Также интересно, что такая простая вещь может быть такой сложной.
TravisWhidden 01
2
Приведенный выше ответ отлично работает независимо от того, является ли контейнер Gird или StackPanel. Поскольку структура вашей сетки не ясна, трудно сказать, что могло пойти не так. Однако приятно видеть альтернативы.
полезноBee
1
По мне, это тоже единственный, который правильно работает. Хороший способ.
OregonGhost
7

Если вы не нашли решения по другим ответам, вот как я решил проблему.

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

Насколько я понимаю, другие решения могут не работать, потому что вызов Focus()вызывается до того, как приложение отобразит другие компоненты.

анемомилос
источник
3
Этот ответ заслуживает более высокой оценки.
Саймон Мурье
0

Другое возможное решение - использовать FocusBehavior, предоставляемый бесплатной DevExpress MVVM Framework :

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

Он позволяет сфокусировать элемент управления при его загрузке, при возникновении определенного события или изменении свойства.

Алексей Руссков
источник
0

В коде позади вы можете добиться этого, только сделав это.

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

Примечание: он не будет работать до загрузки окна

РазумРастерМир
источник