Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

воскресенье, 18 октября 2009 г.

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 { }
    }

    // …

}

Комментариев нет:

Отправить комментарий