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 { }
}
// …
}
Комментарии
Отправить комментарий