silverlight页,按回车键自动跳转

来源:互联网 发布:淘宝怎么给微信发链接 编辑:程序博客网 时间:2024/05/23 13:03
#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
原创粉丝点击