Получать уведомление, когда фокус меняется в Silverlight 4? - PullRequest
2 голосов
/ 11 февраля 2011

Я пытаюсь отладить некоторые проблемы с отсутствующими / дополнительными остановками табуляции.Есть ли какое-то глобальное событие, к которому я могу присоединиться, чтобы можно было регистрировать, какой элемент получил фокус при изменении фокуса?Спасибо!Вот что я делаю сейчас, и это работает достаточно хорошо, но мне все еще интересно, есть ли другой способ:

DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(0.2);
timer.Tick += onTick;
timer.Start();

// ...

private object LastFocusedElement;
private void onTick(object sender, EventArgs e)
{
    object elem = FocusManager.GetFocusedElement();
    if(LastFocusedElement != elem)
    {
        LastFocusedElement = elem;
        System.Diagnostics.Debug.WriteLine("+++FOCUS+++ Focus changed to: " + elem + (elem == null ? "" : " (" + elem.GetType().Name + ")"));
    }
}

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Вы должны быть в состоянии подписаться на событие GotFocus для "самого верхнего" контейнера. Я не вижу какого-либо обработанного флага для RoutedEventArgs, поэтому, насколько я могу судить, он всегда должен достигать

<UserControl ...
             GotFocus="UserControl_GotFocus">
    <!-- Lots of Nested Controls -->
</UserControl>

private void UserControl_GotFocus(object sender, RoutedEventArgs e)
{
    object elem = e.OriginalSource;
    System.Diagnostics.Debug.WriteLine("+++FOCUS+++ Focus changed to: " + elem + (elem == null ? "" : " (" + elem.GetType().Name + ")"));
}
0 голосов
/ 13 февраля 2011

Вы должны иметь возможность использовать функцию AddHandler, чтобы подключить событие фокуса к вашему элементу управления.

И посмотрите на подпись AddHandler, даже если событие было обработано, вы также сможете получить уведомление.

...