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

98

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

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

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

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

Любая идея?

Теги:
wpf
textbox
focus

8 ответов

126
Лучший ответ

В XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>
  • 7
    Я предпочитаю этот подход другим, так как он соответствует MVVM.
  • 1
    Сфокусированный элемент доступен только для чтения. Как установить xaml? Я использовал это, и это не сработало <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}} /> </ Trigger> </Style.Triggers>
Показать ещё 2 комментария
49

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

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
  • 4
    Что если элемент, на который вы хотите установить фокус, является родительским элементом oO?
  • 9
    FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
45

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

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

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}
  • 10
    САМЫЙ ПОЛЕЗНЫЙ ОТВЕТ В ЭТОЙ ВСЕЙ РЕЗЬБЕ
  • 1
    логически верно, после слишком большой борьбы этот ответ довольно хорош и идеален в качестве решения.
22
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

MSDN:

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

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

16

Попробуйте следующее: MyTextBox.Focus ( );

  • 1
    Это самый элегантный ответ, и он также не требует указания родителя. Спасибо за это, это прекрасно работает для меня!
10

Ничего из этого не сработало для меня, поскольку я использовал сетку, а не 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}" />
  • 1
    Это сработало и для меня. В остальном не было. Спасибо за ссылку, это было довольно интересно. Также интересно, что такая простая вещь может быть такой сложной.
  • 2
    Ответ выше работает отлично, независимо от того, является ли контейнер Gird или StackPanel. Поскольку структура вашей сетки не ясна, трудно сказать, что могло пойти не так. Приятно видеть альтернативы, хотя.
Показать ещё 1 комментарий
0

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

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

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

0

Я немного опоздал на игру. Я попробовал решения, представленные здесь, но они не сработали. Если у кого-то еще есть проблемы с настройкой фокуса, вы можете попробовать это.

<TextBox behave:UserControlBehavior.FocusFirst='True'
Text="Hello World!" />

Ещё вопросы

Сообщество Overcoder
Наверх
Меню