Silverlight 3中的自动标签页

4
我需要在SL3应用程序中实现自动将焦点从一个控件转移到“下一个控件”的功能。例如,一个文本框限制为3个字符-在输入第三个字符时,焦点应自动移动到表单上的下一个控件(我的实际用途略有不同,但这个例子足够说明问题)。
然而,由于SL自动确定选项卡序列,似乎没有办法做到这一点,除非对Silverlight的逻辑进行反向工程/复制,以找出可视树中下一个应该获得焦点的控件。
是否有人已经实现了这一点?
2个回答

4
我正在寻找一个相对通用的解决方案,但我已经能够使用某些相对特定的方法来解决问题。基本上,它使用VisualTreeHelper查找与我想要进行Tab下一个控件具有相同父级的子控件,并将焦点设置到那里。
这比必须浏览所有控件(这是针对一个非常大的LOB应用程序)并为每个控件配置“下一个”控件更容易接受。
以下是我的代码,以防对其他人有所帮助。(VisualTreeeHelperUtil是我自己编写的一个类,它添加了一些实用函数到VisualTreeHelper中)
public static void TabNext(DependencyObject parentElement, Control fromControl)
{
    var children = VisualTreeHelperUtil.FindChildren<Control>(parentElement).
        Where(c => c.IsEnabled && c.IsTabStop && c.Visibility == Visibility.Visible).
        ToList();

    if (children.Contains(fromControl))
    {
        var thisIndex = children.IndexOf(fromControl);
        var targetIndex = thisIndex + 1;
        if (children.Count > targetIndex)
        {
            var targetChild = children[targetIndex];
            fromControl.Dispatcher.BeginInvoke(() =>
               {
                   targetChild.Focus();
                   var txt = targetChild as TextBox;
                   if (txt != null)
                   {
                       txt.SelectAll();
                   }
               });
        }
    }
}

感谢@Craig Shearer的分享。我最终使用了自定义的附加行为,并进行了一些代码调整。请查看代码:https://gist.github.com/4576803 - Jone Polvora

2
如果您正在寻找一种通用解决方案,并且可以基于可视树顺序(而不是排列布局)进行,则我认为这并不难。虽然我没有听说过这样做的情况。
我看到的大多数电话号码或信用卡输入表单,当正确的字符数量已经输入时,都会在适当的更改处理程序中硬编码下一个字段。
由于您的自动对焦解决方案(针对3个字符)似乎已经需要某种事件挂钩,因此您是否可以直接进行以下操作:1)硬编码到您知道的下一个表单元素进行聚焦,2)使用Tag属性存储要聚焦的控件名称,然后在该控件上执行FindName + Focus,或者3)通过VisualTreeHelper(或对等逻辑树搜索)进行某种形式的搜索?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接