internal bool ValidateTabKeyHandleIsWithin( FrameworkElement originalSource, KeyboardDevice keyboardDevice ) { DependencyObject predictedNextVisual = null; //If the original source is not a control (e.g. the cells panel instead of a cell), columns will be used to move focus. //In the case of a ListBox set with Cycle or Contained navigation mode, we must move in the other direction if on the first or last item, //since PedictFocus will throw is we use FocusNavigationDirection.First/Last. if( originalSource != null ) { if( ( keyboardDevice.Modifiers & ModifierKeys.Shift ) == ModifierKeys.Shift ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Left ); if( predictedNextVisual == null ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Up ); if( predictedNextVisual == null ) { KeyboardNavigationMode navigationMode = ( KeyboardNavigationMode )originalSource.GetValue( KeyboardNavigation.TabNavigationProperty ); if( navigationMode == KeyboardNavigationMode.Cycle || navigationMode == KeyboardNavigationMode.Contained ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Right ); if( predictedNextVisual == null ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Down ); } } } } } else { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Right ); if( predictedNextVisual == null ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Down ); if( predictedNextVisual == null ) { KeyboardNavigationMode navigationMode = ( KeyboardNavigationMode )originalSource.GetValue( KeyboardNavigation.TabNavigationProperty ); if( navigationMode == KeyboardNavigationMode.Cycle || navigationMode == KeyboardNavigationMode.Contained ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Left ); if( predictedNextVisual == null ) { predictedNextVisual = originalSource.PredictFocus( FocusNavigationDirection.Up ); } } } } } } if( predictedNextVisual != null ) { Cell ownerCell = Cell.FindFromChild( predictedNextVisual ); if( ( ownerCell != null ) && ( ownerCell.ParentColumn == this.ParentDataGridControl.CurrentColumn ) ) { if( object.Equals( ownerCell.ParentRow.DataContext, this.ParentDataGridControl.CurrentItemInEdition ) ) return true; } } return false; }
private static DependencyObject PredictNextElement( FrameworkElement source, KeyboardDevice device ) { foreach( var direction in NavigationHelper.GetFocusNavigationDirections( source, device ) ) { var target = source.PredictFocus( direction ); if( target != null ) return target; } return null; }