Cariño, he perdido el foco

El orden de tabulación en una aplicación es uno de esos pequeños detalles que, no siendo a veces ni un requerimiento funcional, hace perder calidad y buena presencia a tu aplicación. Es por tanto importante decidir a qué elementos vamos a dejar navegar pulsando el tabulador y en qué orden lo vamos a hacer. Esto en Silverlight lo hacemos mediante las propiedades IsTabStop y TabIndex.

Pero a veces hacer esto no es tan fácil. Podemos tener controles que no sepamos que pueden recoger el foco y a los que no estemos estableciendo correctamente las propiedades, o que el estilo de los controles no contemple el foco y no sepamos por donde anda.

Si nos pasa esto, necesitamos de un mecanismo que nos ayude a saber qué elemento tiene actualmente el foco. Con esta clase de ayuda podremos conseguir este objetivo:

 

public static class FocusHelper
{
    private static System.Threading.Timer focusTimer;
    private static Control lastFocus = null;

    public static void Start()
    {
        focusTimer = new Timer(new TimerCallback((o) =>
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                object temp = null;

                temp = FocusManager.GetFocusedElement();

                if (temp != lastFocus)
                {
                    if (temp is Control)
                    {
                        Control conTemp = temp as Control;
                        var conTempParent = conTemp.Parent;

                        lastFocus = temp as Control;

                        Debug.WriteLine(«Current Focus: Control » + conTemp.Name + » of Type » + conTemp + » in » + conTempParent);

                    }
                }
            });
        }), null, 0, 100);
    }

   public static void Stop()
    {
        focusTimer.Change(0, System.Threading.Timeout.Infinite);
    }
}

 

Y con esto, llamamos a FocusHelper.Start() donde nos interese debugar el orden de tabulación y en la pantalla de Output del Visual Studio iremos viendo por donde está el foco.

 

Espero que os sirva de ayuda!

 

Nota: código basado en este post: http://codeblog.larsholm.net/2009/12/focushelper/