Не могу установить фокус на дочерний элемент UserControl - PullRequest
38 голосов
/ 23 марта 2009

У меня есть UserControl, который содержит TextBox. Когда мое главное окно загружается, я хочу установить фокус на это текстовое поле, поэтому я добавил Focusable="True" GotFocus="UC_GotFocus" в определение UserControl s и FocusManager.FocusedElement="{Binding ElementName=login}" в определение основного окна. В методе UC_GotFocus я просто вызываю .Focus() на элементе управления, на котором хочу сосредоточиться, но это не работает.

Все, что мне нужно сделать, это иметь TextBox в фокусе UserControl получения при запуске приложения.

Любая помощь будет оценена, спасибо.

Ответы [ 18 ]

1 голос
/ 01 декабря 2015

Я преобразовал ответ Фузквата в метод расширения. Я использую это вместо Фокуса (), где Фокус () не работал.

using System;
using System.Threading;
using System.Windows;

namespace YourProject.Extensions
{
    public static class UIElementExtension
    {
        public static void WaitAndFocus(this UIElement element, int ms = 100)
        {
            ThreadPool.QueueUserWorkItem(f =>
            {
                Thread.Sleep(ms);

                element.Dispatcher.Invoke(new Action(() =>
                {
                    element.Focus();
                }));
            });
        }
    }
}
1 голос
/ 19 декабря 2013

Что меня устроило, так это атрибут FocusManager.FocusedElement . Сначала я попытался установить его в UserControl, но он не работал.

Поэтому я попытался поместить его в первый дочерний элемент UserControl:

<UserControl x:Class="WpfApplication3.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid FocusManager.FocusedElement="{Binding ElementName=MyTextBox, Mode=OneWay}">
    <TextBox x:Name="MyTextBox"/>
</Grid>

... и это сработало! :)

0 голосов
/ 29 июня 2011

У меня есть пользовательский элемент управления - панель стека с двумя текстовыми полями. Текстовые поля были добавлены в конструктор, а не в xaml. Когда я пытаюсь сфокусировать первое текстовое поле, ничего не происходит. Решение проблемы с загруженным событием решило мою проблему. Просто вызвал control.Focus () в событии Loaded и прочем.

0 голосов
/ 30 октября 2013

Мне не нравятся решения с настройкой другой области вкладок для UserControl. В этом случае при навигации по клавиатуре у вас будет две разные вставки: в окне и в другой - внутри пользовательского элемента управления. Мое решение - просто перенаправить фокус с пользовательского контроля на внутренний дочерний контроль. Установите фокус на пользовательский элемент управления (потому что по умолчанию это false):

<UserControl ..... Focusable="True">

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

protected override void OnGotFocus(RoutedEventArgs e)
{
    base.OnGotFocus(e);
    MyTextBox.Focus();
}

protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
    base.OnGotKeyboardFocus(e);
    Keyboard.Focus(MyTextBox);
}
0 голосов
/ 23 декабря 2011

Предполагая, что вы хотите установить фокус для текстового поля «Имя пользователя», пользователь может вводить его каждый раз, когда оно появляется.

В конструкторе вашего контроля:

this.Loaded += (sender, e) => Keyboard.Focus(txtUsername);
0 голосов
/ 16 августа 2013

Я установил его в PageLoaded () или загрузил элемент управления, но затем я вызываю асинхронную службу WCF и делаю вещи, которые, кажется, теряют фокус. Я должен установить это в конце всего, что я делаю. Это нормально и все, но иногда я делаю изменения в коде, а потом забываю, что я также устанавливаю курсор.

0 голосов
/ 19 июля 2012

Попробовав сочетания вышеизложенных предложений, я смог надежно назначить фокус нужному текстовому полю в дочернем элементе управления UserControl следующим образом. В основном, сфокусируйтесь на дочернем элементе управления, и пусть дочерний UserControl фокусируется на его TextBox. Оператор focus TextBox сам по себе вернул true, но не дал желаемого результата, пока пользовательский элемент управления также не получил фокус. Я должен также отметить, что UserControl не смог запросить фокус для себя и должен был быть предоставлен окном.

Для краткости я пропустил регистрацию событий Loaded в Window и UserControl.

Window

private void OnWindowLoaded(object sender, RoutedEventArgs e)
{
    ControlXYZ.Focus();
}

UserControl

private void OnControlLoaded(object sender, RoutedEventArgs e)
{
    TextBoxXYZ.Focus();
}
0 голосов
/ 30 января 2012

У меня была такая же проблема с настройкой фокуса клавиатуры на холст в пользовательском элементе управления WPF. Мое решение

  1. В XAML установить элемент на Focusable="True"
  2. В element_mousemove событие создает простую проверку:

    if(!element.IsKeyBoardFocused)
        element.Focus();
    

В моем случае все работает нормально.

...