#region 自动跳转
void InitializeControls()
{
//把界面上的TextBox,RadioButton,ComboBox,CheckBox都加入列表
//注:一般业务录入界面上只有这4种类型的输入控件,如果还有其实类型,可自行扩展
allInputControls.AddRange(FindChildren<TextBox>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<RadioButton>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<ComboBox>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<CheckBox>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<Button>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<PasswordBox>(LayoutRoot).Cast<Control>());
//按TabIndex排序
allInputControls = allInputControls.OrderBy(c => c.TabIndex).ToList();
foreach (Control c in allInputControls)
{
c.KeyDown += EnterKeyDownToTab;
if (c is ComboBox)
{
//ComboBox要特殊处理
(c as ComboBox).DropDownClosed += DropDownClosedToNext;
}
}
}
void EnterKeyDownToTab(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
GoToNextControl(sender);
}
}
void GoToNextControl(object sender)
{
var self = sender as Control;
if (self == null)
{
return;
}
var selfTabIndex = self.TabIndex;
//找出下一个控件
var nextControl = allInputControls.FirstOrDefault(c => c.TabIndex > selfTabIndex);
if (nextControl != null)
{
nextControl.Focus();
}
else
{
allInputControls[0].Focus();//最后一个控件时,再跳到第一个(可选处理)
}
}
/// <summary>
/// 查找所有子元素(递归)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parent"></param>
/// <returns></returns>
public static IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class
{
int count = VisualTreeHelper.GetChildrenCount(parent);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
var t = child as T;
if (t != null)
yield return t;
IEnumerable<T> children = FindChildren<T>(child);
foreach (T item in children)
yield return item;
}
}
}
private void DropDownClosedToNext(object sender, EventArgs e)
{
GoToNextControl(sender);
}
#endregion
void InitializeControls()
{
//把界面上的TextBox,RadioButton,ComboBox,CheckBox都加入列表
//注:一般业务录入界面上只有这4种类型的输入控件,如果还有其实类型,可自行扩展
allInputControls.AddRange(FindChildren<TextBox>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<RadioButton>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<ComboBox>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<CheckBox>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<Button>(LayoutRoot).Cast<Control>());
allInputControls.AddRange(FindChildren<PasswordBox>(LayoutRoot).Cast<Control>());
//按TabIndex排序
allInputControls = allInputControls.OrderBy(c => c.TabIndex).ToList();
foreach (Control c in allInputControls)
{
c.KeyDown += EnterKeyDownToTab;
if (c is ComboBox)
{
//ComboBox要特殊处理
(c as ComboBox).DropDownClosed += DropDownClosedToNext;
}
}
}
void EnterKeyDownToTab(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
GoToNextControl(sender);
}
}
void GoToNextControl(object sender)
{
var self = sender as Control;
if (self == null)
{
return;
}
var selfTabIndex = self.TabIndex;
//找出下一个控件
var nextControl = allInputControls.FirstOrDefault(c => c.TabIndex > selfTabIndex);
if (nextControl != null)
{
nextControl.Focus();
}
else
{
allInputControls[0].Focus();//最后一个控件时,再跳到第一个(可选处理)
}
}
/// <summary>
/// 查找所有子元素(递归)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parent"></param>
/// <returns></returns>
public static IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class
{
int count = VisualTreeHelper.GetChildrenCount(parent);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
var t = child as T;
if (t != null)
yield return t;
IEnumerable<T> children = FindChildren<T>(child);
foreach (T item in children)
yield return item;
}
}
}
private void DropDownClosedToNext(object sender, EventArgs e)
{
GoToNextControl(sender);
}
#endregion