Встановіть фокус на текстовому полі в 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.