Пример #1
0
        private static bool TryMoveFocusWithOptionsImpl(
            FocusNavigationDirection focusNavigationDirection,
            FindNextElementOptions pFocusNavigationOverride)
        {
            IAsyncOperation <FocusMovementResult>?asyncOperation = null;
            var isFocusMoved = TryMoveFocusStatic(focusNavigationDirection, pFocusNavigationOverride, ref asyncOperation, false);

            return(isFocusMoved);
        }
Пример #2
0
        private static IAsyncOperation <FocusMovementResult> TryMoveFocusWithOptionsAsyncImpl(
            FocusNavigationDirection focusNavigationDirection,
            FindNextElementOptions focusNavigationOptions)
        {
            IAsyncOperation <FocusMovementResult>?asyncOperation = null;
            var focusMoved = TryMoveFocusStatic(focusNavigationDirection, focusNavigationOptions, ref asyncOperation, true);

            return(asyncOperation ?? AsyncOperation.FromTask(ct => Task.FromResult(new FocusMovementResult())));
        }
Пример #3
0
        public static DependencyObject?FindNextElement(FocusNavigationDirection focusNavigationDirection, FindNextElementOptions focusNavigationOptions)
        {
            if (!Enum.IsDefined(typeof(FocusNavigationDirection), focusNavigationDirection))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(focusNavigationDirection),
                          "Invalid value of focus navigation direction was used.");
            }

            if (focusNavigationOptions is null)
            {
                throw new ArgumentNullException(nameof(focusNavigationOptions));
            }

            return(FindNextElementWithOptionsImpl(focusNavigationDirection, focusNavigationOptions));
        }
Пример #4
0
        public static IAsyncOperation <FocusMovementResult> TryMoveFocusAsync(FocusNavigationDirection focusNavigationDirection, FindNextElementOptions focusNavigationOptions)
        {
            if (!Enum.IsDefined(typeof(FocusNavigationDirection), focusNavigationDirection))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(focusNavigationDirection),
                          "Invalid value of focus navigation direction was used.");
            }

            if (focusNavigationDirection == FocusNavigationDirection.Next ||
                focusNavigationDirection == FocusNavigationDirection.Previous ||
                focusNavigationDirection == FocusNavigationDirection.None)
            {
                throw new ArgumentOutOfRangeException(
                          "Focus navigation directions Next, Previous, and None are not supported when using FindNextElementOptions",
                          nameof(focusNavigationDirection));
            }

            if (focusNavigationOptions is null)
            {
                throw new ArgumentNullException(nameof(focusNavigationOptions));
            }

            return(TryMoveFocusAsyncImpl(focusNavigationDirection));
        }
Пример #5
0
        private static DependencyObject?FindNextElementWithOptionsImpl(
            FocusNavigationDirection focusNavigationDirection,
            FindNextElementOptions pFocusNavigationOverride)
        {
            var options = pFocusNavigationOverride;

            var xyFocusOptions = new XYFocusOptions
            {
                UpdateManifold = false
            };

            var searchRoot    = options.SearchRoot;
            var exclusionRect = options.ExclusionRect;
            var hintRect      = options.HintRect;
            var navigationStrategyOverride = options.XYFocusNavigationStrategyOverride;
            var ignoreOcclusivity          = options.IgnoreOcclusivity;

            ContentRoot?contentRoot = null;

            if (searchRoot != null)
            {
                contentRoot = VisualTree.GetContentRootForElement(searchRoot);
            }
            else if (InIslandsMode())
            {
                // Return error if searchRootAsDO is not valid in islands/desktop mode
                throw new InvalidOperationException("Search root is not a dependency object.");
            }
            else
            {
                contentRoot = DXamlCore.Current.GetHandle().ContentRootCoordinator.CoreWindowContentRoot;
            }

            // If we are being passed in the public root visual of the XamlRoot as the SearchRoot, then override the SearchRoot to be the RootVisual.
            // This will enable searching through both the public root visual and the popup root. We will also allow Next/Prev.
            var shouldOverrideSearchRoot =
                contentRoot != null &&
                GetAppVisibleXamlRootContent(contentRoot) == searchRoot;

            if (shouldOverrideSearchRoot)
            {
                searchRoot = contentRoot !.VisualTree.RootElement;
            }
            else
            {
                if (focusNavigationDirection != FocusNavigationDirection.Up &&
                    focusNavigationDirection != FocusNavigationDirection.Down &&
                    focusNavigationDirection != FocusNavigationDirection.Left &&
                    focusNavigationDirection != FocusNavigationDirection.Right)
                {
                    throw new ArgumentOutOfRangeException(
                              "Focus navigation directions Next, Previous, and None " +
                              "are not supported when using FindNextElementOptions");
                }
            }

            if (searchRoot != null)
            {
                xyFocusOptions.SearchRoot = searchRoot;
            }

            if (!exclusionRect.IsUniform)
            {
                xyFocusOptions.ExclusionRect = exclusionRect;
            }

            if (!hintRect.IsUniform)
            {
                xyFocusOptions.FocusHintRectangle = hintRect;
            }

            xyFocusOptions.NavigationStrategyOverride = navigationStrategyOverride;
            xyFocusOptions.IgnoreOcclusivity          = ignoreOcclusivity;

            var candidate = FindNextFocus(focusNavigationDirection, xyFocusOptions);

            return(candidate as DependencyObject);
        }