/// <summary> /// 在最外层的 Layer 中来进行移动。 /// </summary> private void MoveToScope() { if (!_removed) { _removed = true; _scope.GotKeyboardFocus -= scope_GotKeyboardFocus; var tracker = new FocusTrackerAdorner(_scope, _scopeLayer); _scopeLayer.Add(tracker); //如果本次焦点切换后,本 Adorner 还在 _scope 中,则找到它的位置并设置为 ScopeAdorner 的初始位置。 //如果本 Adorner 在一个面签中,并且焦点切换是因为切换这个页签造成,则这个判断为 false. if (this.IsDescendantOf(_scope)) { var startFrom = this.TransformToAncestor(_scope).Transform(_tracker.Dest.TopLeft); tracker._tracker.MoveTo(new Rect(startFrom, _focusedElement.RenderSize), false); } _layer.Remove(this); } }
/// <summary> /// 把当前层加入到内部层中。 /// </summary> private void MoveToInnerLayer(AdornerLayer targetLayer) { var layerParent = VisualTreeHelper.GetParent(targetLayer) as Visual; var root = VisualTreeHelper.GetChild(layerParent, 0) as UIElement; if (root != null) { if (!_removed) { _removed = true; _scope.GotKeyboardFocus -= scope_GotKeyboardFocus; //必须重新构造一个,否则由于 AdornedElement 不在 root 内,造成无法添加到 targetLayer 中。 var tracker = new FocusTrackerAdorner(root, targetLayer, _scope, _scopeLayer); targetLayer.Add(tracker); //设置初始的位置。 var startFrom = _focusedElement.TransformToAncestor(root).Transform(new Point()); tracker._tracker.MoveTo(new Rect(startFrom, _focusedElement.RenderSize), false); _layer.Remove(this); } } }