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. Мышь не найдена. Пожалуйста, подсоедините мышь.

SVN: Пропали иконки TortoiseSVN.

Вывод в cmd или bat пустой строки.