Ejemplo n.º 1
0
        /// <summary>
        /// 尝试焦点移动到目标元素
        /// </summary>
        /// <param name="target"></param>
        public void FlowTo(ComponentBase target)
        {
            //如果目标不在列表中,则不处理
            var targetIndex = FlowList.IndexOf(target);

            if (targetIndex < 0)
            {
                return;
            }
            //若当前要素为空,则重置到顶点
            var currentIndex = FlowList.IndexOf(CurrentElement);

            if (currentIndex < 0)
            {
                MoveFocusHost(FlowNavigation.Top);
                return;
            }
            //开始组织焦点移动
            if (currentIndex > targetIndex)
            {
                //尝试往目标进行转移
                SetFlow(target);
            }
            else if (currentIndex < targetIndex)
            {
                //检查是否允许跳过控制
                if (GetCanSkipFlow(target))
                {
                    SetFlow(target);
                }
                else
                {
                    while (true)
                    {
                        if (!MoveFocusHost(FlowNavigation.Forward))
                        {
                            break;
                        }
                        var index = FlowList.IndexOf(CurrentElement);
                        if (targetIndex <= index)
                        {
                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 按照参数指定的方向进行一次移动
        /// </summary>
        public bool MoveFocusHost(FlowNavigation navigation)
        {
            //当前焦点元素的位置
            var currentIndex = FlowList.IndexOf(CurrentElement);

            switch (navigation)
            {
            case FlowNavigation.Top:
                //清除当前焦点元素,然后重新往下移动
                CurrentElement = null;
                return(MoveFocusHost(FlowNavigation.Forward));

            case FlowNavigation.Backward:
                //若当前元素不存在,则移动到顶端
                if (currentIndex < 0)
                {
                    return(MoveFocusHost(FlowNavigation.Top));
                }
                //从当前位置倒序查找回退位置,若当前位置为0,则不移动
                while (currentIndex > 0)
                {
                    currentIndex--;
                    var target = FlowList[currentIndex];
                    if (IsFlowable(target))
                    {
                        //位置合适,进行移动,此时触发Enter系列事件
                        if (!RaiseEnterEvent(target))
                        {
                            return(false);
                        }
                        CurrentElement = target;
                        return(true);
                    }
                }
                FlowToTop?.Invoke(this, new RoutedEventArgs());
                return(false);

            case FlowNavigation.Forward:
                if (CurrentElement != null && !RaiseLeaveEvent(CurrentElement))
                {
                    return(false);
                }
                //沿着流程列表往下找焦点控件
                while (currentIndex + 1 < FlowList.Count)
                {
                    currentIndex++;
                    var target = FlowList[currentIndex];
                    if (IsFlowable(target))
                    {
                        if (!RaiseEnterEvent(target))
                        {
                            return(false);
                        }
                        CurrentElement = target;
                        return(true);
                    }
                }
                //触发移动到最后的事件
                FlowToEnd?.Invoke(this, new RoutedEventArgs());
                return(false);

            default: return(false);
            }
        }