Встановіть фокус на текстовому полі в WPF


105

Як встановити фокус на TextBoxелементі в WPF

У мене є цей код:

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

... але це не працює.

Будь-яка ідея?


txtCompanyID.Focusable = вірно; Keyboard.Focus (txtCompanyID); це працює, але ось як.
— MindRoasterMir

Відповіді:


145

У XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
Я віддаю перевагу такому підходу, ніж іншим вище, оскільки він підтримує MVVM.
— Тодд Шпранг

1
Сфокусований елемент правильно прочитаний Як ви можете встановити в xaml? Я використав це, і це не спрацювало <Style.Triggers> <Trigger Properties = "Validation.HasError" Value = "True"> <Setter Properties = "FocusManager.FocusedElement" Value = "{Прив'язуючий джерело = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
— WPFKK

@ User841612, перевірте посилання і перевірити Assembly і простір імен msdn.microsoft.com/en-us/library / ...
— usefulBee

Це працює лише один раз. Якщо ви хочете змінити фокус після того, як сторінка побудована, це потрібно зробити програмно.
— Джо Стіл

це теж працює. txtCompanyID.Focusable = вірно; Keyboard.Focus (txtCompanyID);
— MindRoasterMir

51

Поки ніхто не пояснив, чому код у питанні не працює. Я здогадуюсь, що код був розміщений у конструкторі Вікна. Але в цей час ще зарано ставити фокус. Це потрібно зробити, як тільки Вікно готове до взаємодії. Найкраще місце для коду - подія Loaded:

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

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
Логічно вірно, після занадто великої боротьби ця відповідь є досить хорошою та ідеальною як рішення.
— шивані

це працювало для мене. прийняту відповідь не став. Спасибі
— BoundForGlory

не впевнений , що якщо до конкретної версії, але Focus()вимагає фокусування стану параметра - наприкладtxtCompanyId.Focus(FocusState.Keyboard)
— Dan


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

msdn:

На всьому робочому столі може бути лише один елемент, який має фокус клавіатури. У WPF, елемент, у якому фокус клавіатури, буде IsKeyboardFocused встановлений у значення true.

Ви можете перерватися після лінії налаштування і перевірити вартість IsKeyboardFocusedвластивості. Також перевірте, чи дійсно ви досягли цієї лінії або, можливо, ви встановили якийсь інший елемент, щоб отримати фокус після цього.


19

Спробуйте це : MyTextBox.Focus ( );


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}" />

2
Це працювало і для мене. Іншого не було. Дякую за посилання, що було досить цікаво. Також цікаво, що така проста річ може бути настільки складною.
— TravisWhidden

2
Вищезгадана відповідь справно працює незалежно від того, є контейнер Gird або StackPanel. Оскільки структура вашої сітки не зрозуміла, важко сказати, що могло піти не так. Приємно бачити альтернативи, хоча.
— корисноБег

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();
        }

Примітка. Він не буде працювати перед завантаженням вікна

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.