Как установить фокус в перезагрузке страницы WPF? - PullRequest
0 голосов
/ 07 октября 2008

У меня есть браузерное приложение WPF с несколькими страницами. Когда я переключаюсь между страницами, я хочу установить фокус клавиатуры.

Когда страница загружается в первый раз, это работает, вызывая Control.Focus() в конструкторе.

Но когда я переключаюсь между страницами, это больше не работает - фокус только на первом поле и игнорирует мои попытки изменить его на что-то еще: (

Страницы имеют атрибут KeepAlive=true - было бы хорошо, если бы это также поддержало фокусировку, но просто установка фокуса на первое поле раздражает.

Я попытался установить фокус в загруженном событии, но это тоже не сработало. Кажется, фокус по умолчанию устанавливается после перезагрузки страницы.

Есть ли способ установить фокус при входе на страницу во второй раз? Когда, как и где мне следует установить фокус при переключении страниц WPF в браузерном приложении ?

Ответы [ 4 ]

4 голосов
/ 20 февраля 2009

Попробуйте добавить FocusManager.FocusedElement = "{Binding ElementName = [...]}" `` к первому элементу на вашей странице и установите [...] имя элемента, который должен получить фокус.

1 голос
/ 24 января 2011

После того, как у меня был «кошмар WPF Initial Focus Nightmare» и на основе некоторых ответов в стеке, следующее оказалось для меня лучшим решением.

Сначала добавьте свой App.xaml OnStartup () следующим образом:

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent,
          new RoutedEventHandler(WindowLoaded));

Затем добавьте событие WindowLoaded также в App.xaml:

void WindowLoaded(object sender, RoutedEventArgs e)
    {
        var window = e.Source as Window;
        System.Threading.Thread.Sleep(100);
        window.Dispatcher.Invoke(
        new Action(() =>
        {
            window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

        }));
    }

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

Я нашел следующее решение лучше всего, так как оно используется глобально для всего приложения.

Надеюсь, это поможет ...

Оран

1 голос
/ 07 октября 2008

Вы пытались установить фокус в обработчике событий Loaded, а не в конструкторе? Страницы не восстанавливаются при возврате к ним, но они перезагружаются, если я правильно помню.

0 голосов
/ 21 октября 2008

Поскольку я не нашел решения этой проблемы, я использовал простой обходной путь:

Я запускаю вторичный поток, который меняет фокус после загрузки страницы.

К счастью, это очень легко сделать с помощью BeginInvoke:

myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
(System.Threading.SendOrPostCallback)delegate(object state) 
{ 
  myControl.Focus(); 
});

Это сработало намного лучше, чем я когда-либо ожидал, поэтому, вероятно, этот обходной путь будет использоваться долгое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...