2009-08-30 59 views
4

我有一个要求,可以从一个控件自动选择到SL3应用程序中的“下一个控件”。例如,一个文本框限制为3个字符 - 在输入第三个字符时,焦点应自动移动到表单上的下一个控件(我的实际用法稍有不同,但该示例足够)。Silverlight 3中的自动标签页

但是,由于SL自动确定选项卡序列,除了逆向工程/复制Silverlight的逻辑以找出视觉树中的哪个控件应该是下一个获得焦点的控件之外,似乎没有办法做到这一点。

有没有人已经实现了这一点?

回答

2

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

大部分的电话号码或信用卡条目表单我看到这种行为老实说,只是在正确的变更处理程序中硬编码下一个字段,当输入正确的字符数。

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

4

我一直在寻找一个相当普遍的解决方案 - 但我已经能够做一些相当具体的事情 - 基本上它使用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(); 
        } 
       }); 
     } 
    } 
} 
+0

感谢@Craig Shearer for sharing this。我已经结束了一些自定义附加的行为和一些代码适应。看看代码:https://gist.github.com/4576803 – 2013-01-20 05:25:08