代码之家  ›  专栏  ›  技术社区  ›  Craig Shearer

Silverlight 3中的自动选项卡

  •  4
  • Craig Shearer  · 技术社区  · 16 年前

    有人已经实施了吗?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Craig Shearer    16 年前

    我正在寻找一个相当通用的解决方案-但我已经可以做一些相当具体的事情-基本上它使用VisualTreeHelper来查找父控件与我想在旁边制表符相同的子控件,并设置焦点。

    这是我的代码,以防对其他人有所帮助。(VisualTreeHelperUtil是我自己的一个类,它向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();
                       }
                   });
            }
        }
    }
    
        2
  •  2
  •   Jeff Wilcox    16 年前

    如果您正在寻找一个通用的解决方案,并且可以基于可视化的树排序(与排列的布局相反),我想它不会那么糟糕。不过,还没听说有人这么做。

    老实说,我见过的大多数电话号码或信用卡输入表单都只是在输入了正确的字符后,在正确的更改处理程序中硬编码下一个字段。

    因为听起来你的自动对焦解决方案(对于3个字符)已经需要某种类型的事件连接,监视TextChanged事件,你能不能继续进行1)硬编码Focus()到你知道的下一个表单元素,2)使用Tag属性来存储下一个要关注的控件的名称,然后就这样做了吗一个FindName+专注于此,或者3)做某种VisualTreeHelper(或者通过对等点进行逻辑树搜索)?