internal void CoreSetResults(FocusMovementResult coreFocusMovementResult) { if (_focusMovementResult == null) { _focusMovementResult = new FocusMovementResult(); } bool wasMoved = coreFocusMovementResult.WasMoved && !coreFocusMovementResult.WasCanceled; _focusMovementResult.Succeeded = wasMoved; }
internal bool Focus(FocusState focusState, bool animateIfBringIntoView, FocusNavigationDirection focusNavigationDirection = FocusNavigationDirection.None) { // Get FocusManager var pFocusManager = VisualTree.GetFocusManagerForElement(this, VisualTree.LookupOptions.NoFallback); if (pFocusManager == null) { return(false); } // FocusMovement is OK with NULL parameter, sets focusChanged to false FocusMovement movement = new FocusMovement(this, focusNavigationDirection, focusState); movement.AnimateIfBringIntoView = animateIfBringIntoView; FocusMovementResult result = pFocusManager.SetFocusedElement(movement); var focusChanged = result.WasMoved; return(focusChanged); }
internal static DirectionalFocusInfo TryDirectionalFocus(IFocusManager focusManager, FocusNavigationDirection direction, DependencyObject searchScope) { var info = DirectionalFocusInfo.Default; if (direction == FocusNavigationDirection.Next || direction == FocusNavigationDirection.Previous || direction == FocusNavigationDirection.None) { return(info); } // We do not want to process direction focus if the element is not a UIElement (ie. Hyperlink) if (!(searchScope is UIElement uiElement)) { return(info); } var mode = uiElement.XYFocusKeyboardNavigation; if (mode == XYFocusKeyboardNavigationMode.Disabled) { info.ShouldBubble = false; } else if (mode == XYFocusKeyboardNavigationMode.Enabled) { info.DirectionalFocusEnabled = true; var xyFocusOptions = XYFocusOptions.Default; xyFocusOptions.SearchRoot = searchScope; xyFocusOptions.ShouldConsiderXYFocusKeyboardNavigation = true; var candidate = focusManager.FindNextFocus(new FindFocusOptions(direction), xyFocusOptions, null, true); if (candidate != null) { FocusMovementResult result = focusManager.SetFocusedElement(new FocusMovement(candidate, direction, FocusState.Keyboard)); info.Handled = result.WasMoved; info.FocusCandidateFound = true; } } return(info); }
public void ValidateTryDirectionalFocus() { var element = new Control(); element.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Enabled; var candidate = new Control(); candidate.XYFocusKeyboardNavigation = XYFocusKeyboardNavigationMode.Disabled; var focusManagerMock = new MockFocusManager(); focusManagerMock.FindNextFocusResult = candidate; var result = new FocusMovementResult(true, false); focusManagerMock.SetFocusedElementResult = result; var info = FocusSelection.TryDirectionalFocus(focusManagerMock, FocusNavigationDirection.Right, element); Assert.IsTrue(info.Handled); }