Silverlight: Корректное манипулирование фокусом при его потере



Вам нужно при нажатии на кнопку анимировать ее и на время анимации заблокировать ее от пользователя. Если блокировать кнопку через IsEnebled=false, (подскажите мне дроугой способ) то фокус переходит на следующий в дереве элемент управления принимающий фокус.
Например в моем случае я блокирую кнопку Save и получаю фокус на кнопке Delete, что ужасно :)
Дружественно решить это поможет задание фокуса на корневом элементе Application.Current.RootVisual перед или сразу после установки myButton.IsEnebled=false.
Единственное ограничение, которое легко обойти, не выставляйте, при старте приложения Silverlight, в RootVisual элемент не наследуемый от Conrol.
Если вы оставите все как есть, то в RootVisual будет UserConrol, что нам и нужно. Если вас не ломает и не выворачивает жестоко, то вы так и сделаете :)

А вот желанный кусочек кода
public static class UiUtilsCommon
{

    // …

    /// <summary>
    /// Снятие фокуса с текущего элемента и постановка его на RootVisual.
    /// Используется когда на элементе принимающем фокус нужно задать IsEnebled=false, например в анимации, при этом фокус автоматически переходит на следующий в дереве
    /// элемент управления, что часто не желательно, поэтому можно демократично установить фокус на RootVisual
    /// </summary>
    public static void TrySetFocusOnRootVisual()
    {
        // т.к. в RootVisual при запуске приложения можно задать любой UI, то этот функционал не будет работать если RootVisual не неаследуется от Control, защитимся от этого
        try
        {
            ((Control)Application.Current.RootVisual).Focus();
        }
        catch { }
    }

    // …

}

Комментарии

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

Как экспортировать контакты из iPhone

The type or namespace name 'IISOle' could not be found (are you missing a using directive or an assembly reference?)