我需要能够在SL3应用程序中从一个控件自动选项卡到“下一个控件”。例如,TextBox限制为3个字符 - 在键入第3个字符时,焦点应自动移动到表单上的下一个控件(我的实际用法略有不同,但该示例就足够了)。
然而,由于SL自动确定标签序列,除了逆向工程/复制Silverlight的逻辑以确定可视树中的哪个控件应该是获得焦点的下一个控件之外,似乎没有办法做到这一点。
有人已经实现了吗?
答案 0 :(得分: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();
}
});
}
}
}
答案 1 :(得分:2)
如果你正在寻找一个通用的解决方案,并且可以基于可视树排序(而不是排列布局),我想它不会那么糟糕。但是,没有听说过它已经完成了。
我已经看到过这种行为的大多数电话号码或信用卡输入表格,只要输入正确的字符数,就会在正确的更改处理程序中对下一个字段进行硬编码。
由于听起来像你的自动聚焦解决方案(3个字符)将需要某种事件连接,监视TextChanged事件,你不能继续前进并且1)硬编码焦点( )到你知道的下一个表单元素,2)使用Tag属性存储你想要下一个焦点的控件的名称,然后对它进行FindName + Focus,或3)做某种VisualTreeHelper(或逻辑树搜索同行)?