【问题标题】:Auto-tab in Silverlight 3Silverlight 3 中的自动选项卡
【发布时间】:2009-08-31 05:41:04
【问题描述】:

我需要能够在 SL3 应用中从一个控件自动切换到“下一个控件”。例如,一个 TextBox 被限制为 3 个字符 - 在键入第 3 个字符时,焦点应自动移至表单上的下一个控件(我的实际用法略有不同,但该示例就足够了)。

但是,由于 SL 会自动确定制表符顺序,除了逆向工程/复制 Silverlight 的逻辑以确定视觉树中的哪个控件应该是下一个获得焦点的控件之外,似乎没有其他方法可以做到这一点。

有人已经实现了吗?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    我一直在寻找一个相当通用的解决方案 - 但我已经能够解决一些相当具体的问题 - 基本上它使用 VisualTreeHelper 来查找与我想要在旁边添加标签的控件具有相同父级的子级,并且将重点放在这一点上。

    这是一个更令人满意的解决方案,而不是必须通过我的所有控件(这适用于相当大的 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 分享这个。我最终得到了带有一些代码调整的自定义附加行为。看代码:gist.github.com/4576803
    【解决方案2】:

    如果您正在寻找一个通用的解决方案,并且可以基于视觉树排序(而不是排列布局),我想它不会那么糟糕。不过没听说过。

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2018-10-31
      • 1970-01-01
      • 2016-09-27
      相关资源
      最近更新 更多