Курсор Фокус на текстовое поле в WPF / C # - PullRequest
19 голосов
/ 06 мая 2009

Я сейчас нахожусь в процессе создания экранной клавиатуры. Я обрабатываю нажатие кнопки с помощью перенаправленных команд. Проблема в том, что когда я нажимаю кнопку на панели клавиатуры, фокус смещается на кнопку, а не на текстовое поле. Требование гласит, что курсор должен всегда появляться в текстовом поле, чтобы указать позицию, где будет вставлен следующий символ. Есть ли способ удержать фокус на текстовом поле, пока кнопка нажата.

Ответы [ 8 ]

34 голосов
/ 06 мая 2009

Чтобы установить логический фокус на элемент управления вводом

FocusManager.SetFocusedElement(this, textboxJack);     // set logical focus

Чтобы установить фокус клавиатуры на элемент управления вводом

Keyboard.Focus(textboxJill);                             // set keyboard focus

Чтобы узнать разницу между логическим и клавиатурным фокусом

Обзор ввода - Фокус на MSDN

8 голосов
/ 17 августа 2012

Получить ссылку для конкретного элемента управления (в этом случае TextBox). После нажатия в методе Button_Click вставьте это:

Dispatcher.BeginInvoke((ThreadStart)delegate
            {
                control.Focus();
            });
5 голосов
/ 20 января 2010

Мне нравятся эти вопросы "сделай домашнее задание для меня"; "требование гласит" ... бесценно. Для тех, кто находит это через Google, трюк для постепенного перемещения курсора в текстовом поле WPF заключается в использовании свойства SelectioNStart.

private void Button_Click(object sender, RoutedEventArgs e)
{
    textBox.Focus();
    textBox.SelectionStart = textName.Text.Length;
}
3 голосов
/ 30 мая 2012
Textbox.Focus();

это будет фокусироваться на текстовом поле

2 голосов
/ 22 декабря 2011

Я решил эту проблему, установив focusable=false для всех кнопок / элементов управления на клавиатуре. Таким образом, вы не потеряете фокус текущего контроля.

1 голос
/ 07 сентября 2012

Я должен был использовать это, чтобы получить желаемый результат

FocusManager.SetFocusedElement(this, UserNameautoCompleteBox);

Key key = Key.Enter;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
RoutedEvent routedEvent = Keyboard.KeyDownEvent; // Event to send

target.RaiseEvent(
    new KeyEventArgs(
        Keyboard.PrimaryDevice,
        PresentationSource.FromVisual(UserNameautoCompleteBox),
        0,
        key) { RoutedEvent = routedEvent }
);
1 голос
/ 17 января 2012

Ваша проблема может быть решена с помощью отдельной области фокусировки для вашей «клавиатуры». Просто примените следующее свойство к элементу управления, который содержит все ваши кнопки, и тогда они будут находиться в отдельной области фокуса и не будут иметь фокус, установленный на них при нажатии

FocusManager.IsFocusScope="True"
0 голосов
/ 01 июня 2015

Я хотел сделать то же самое, но у меня ничего не получалось. Мне действительно нужен был ответ, который работал исключительно в XAML, так как я работаю с MVVM.

Я наконец нашел этот пример: 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}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...