/// <summary> /// Traite l'évènement KeyDown de l'élément associé. /// </summary> /// <param name="sender">La source de l'évènement.</param> /// <param name="e">Les <see cref="System.Windows.Input.KeyEventArgs"/> contenant les données de l'évènement.</param> void AssociatedObject_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { // Détecte la touche entrée (ou return) #if SILVERLIGHT if (e.Key == System.Windows.Input.Key.Enter) #else if (e.Key == System.Windows.Input.Key.Enter || e.Key == System.Windows.Input.Key.Return) #endif { UIElement element = null; // Suivant que shift est enfoncé, cela influe sur le sens de navigation if (e.KeyboardDevice.Modifiers == ModifierKeys.Shift) { // On cherche l'élément précédant le courant element = VisualTreeHelperExtensions.TryFindPrevious <UIElement>(AssociatedObject, tb => Interaction.GetBehaviors(tb).Any(b => b is LinkedEditBehavior)); } else { // On cherche l'élément suivant le courant element = VisualTreeHelperExtensions.TryFindNext <UIElement>(AssociatedObject, tb => Interaction.GetBehaviors(tb).Any(b => b is LinkedEditBehavior)); } // Si un élément est trouvé, on tente de lui donner le focus if (!element.Focus()) { // S'il n'est pas focusable, tente de le donner à son premier enfant qui l'est element = element.GetFirstFocusableChild(); if (element != null) { element.Focus(); } } } }
/// <summary> /// Ajoute l'adorner à l'élément et l'affiche. /// </summary> /// <param name="positionGetter">Un délégué capable d'obtenir la position de la souris ou du touch. /// Voir <see cref="GetPositionDelegate(TouchEventArgs)"/> et <see cref="GetPositionDelegate(MouseEventArgs)"/>.</param> public virtual void AddAdorner(Func <IInputElement, Point> positionGetter) { Assertion.NotNull(positionGetter, "positionGetter"); // Get the parent window _topWindow = (Window)VisualTreeHelperExtensions.TryFindParent <Window>(this.AssociatedObject); if (_topWindow != null) { // Save the initial position _initialMousePosition = positionGetter(_topWindow); // Adding events to the window to make sure dragged adorner comes up when mouse is not over a drop target. _topWindow.AllowDrop = true; _topWindow.PreviewDragEnter += TopWindow_DragEnter; _topWindow.PreviewDragOver += TopWindow_DragOver; } }