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/