2013-10-14 1 views
1

J'ajoute et supprime les raccourcis clavier Keyboard pour le RadDiagramShape sélectionné dans un RadDiagram. J'ai un ManipulationAdorner (une construction Telerik redimensionner/déplacer adorner) sur la forme sélectionnée, que j'utilise pour le redimensionnement glisser personnalisé (mes éléments de redimensionnement glisser sont Thumbs).C# WPF Telerik RadDiagramShape Ajouter les gestionnaires d'événements clés Échec intermittent

La fonctionnalité souhaitée est que le décalage de maintien contraint le rapport d'aspect pendant le redimensionnement par traînée.

Cela fonctionne, la plupart du temps.

J'ai une méthode qui trouve la forme sélectionnée en fonction de l'élément sélectionné (comme la forme sélectionnée contient l'élément sélectionné comme son "Contenu"). J'ai vérifié que c'est la forme correcte.

J'ai également vérifié que mes appels Keyboard.AddKeyUpHandler (selectedShape, OnKeyUp)/Keyboard.AddKeyDownHandler (selectedShape, OnKeyDown) sont toujours en cours d'exécution si désiré (c'est-à-dire dans l'événement drag started).

Parfois, les gestionnaires OnKeyDown et OnKeyUp ne sont simplement jamais appelés lorsque vous appuyez sur la touche majuscule (ou n'importe quelle touche, d'ailleurs), même si les appels de gestionnaire d'ajout ont été précédemment appelés.

Ma question est, ce qui pourrait causer ce problème?

J'ai essayé de déterminer si le focus est à l'origine du problème et je ne peux pas prouver que le focus change. Parfois, je vais devoir simplement cliquer sur la forme sélectionnée, et cliquer à nouveau, pour que les gestionnaires de décalage fonctionnent correctement. La chose étrange est, dans les deux cas, les gestionnaires d'événements sont ajoutés lorsque drag commence.

CheckShiftDepressed() est un appel manuel pour vérifier si une touche Maj est enfoncée avant le début du redimensionnement. La seule raison pour laquelle je détecte les changements de touche lors du redimensionnement de la traînée est de remodeler instantanément la forme sélectionnée lorsque l'on appuie sur la touche shift (selon le format, ou, une fois relâchée, la position du curseur).

Merci à l'avance,

Ryan

morceaux REVELANT de code et XAML ci-dessous:

Les pouces de redimensionnement:

<Style x:Key="ResizingThumbStyle" TargetType="{x:Type Thumb}"> 
    ...   
    <EventSetter Event="DragStarted" Handler="ResizingThumb_DragStarted" /> 
    <EventSetter Event="DragDelta" Handler="ResizingThumb_DragDelta" /> 
    <EventSetter Event="DragCompleted" Handler="ResizingThumb_DragCompleted" /> 
</Style> 

Drag Redimensionner commencé:

private void ResizingThumb_DragStarted(object sender, DragStartedEventArgs e) 
{ 
    // Get the dragged shape starting aspect ratio. 
    if (u_rd_Diagram.SelectedItem != null) 
    { 
     ... 
     CheckShiftDepressed(); 

     SetSelectedShapeShiftKeyListening(true); 
    } 

CheckShiftDepressed:

private void CheckShiftDepressed() 
{ 
    m_ShiftDepressed = (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) ? true : false; 
} 

Drag Redimensionner terminé:

private void ResizingThumb_DragCompleted(object sender, DragCompletedEventArgs e) 
{ 
    ... 
    CheckShiftDepressed(); 

    SetSelectedShapeShiftKeyListening(false); 
} 

Définir les événements d'écoute clés sur la forme sélectionnée:

private void SetSelectedShapeShiftKeyListening(bool ListenForShiftKeyChanges) 
{ 
    RadDiagramShape selectedShape = null; 

    if (GetSelectedShape(out selectedShape)) 
    { 
     if (ListenForShiftKeyChanges) 
     { 
      Keyboard.AddKeyUpHandler(selectedShape, OnKeyUp); 
      Keyboard.AddKeyDownHandler(selectedShape, OnKeyDown); 
     } 
     else 
     { 
      Keyboard.RemoveKeyUpHandler(selectedShape, OnKeyUp); 
      Keyboard.RemoveKeyDownHandler(selectedShape, OnKeyDown); 
     } 
    } 
} 

Pour l'intérêt de personne, les méthodes de gestionnaire OnKeyUp et OnKeyDown:

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    CheckShiftDepressed(); 

    if (m_DraggingResizingThumb) 
    { 
     OnAspectRatioResizingToggled(); 
    } 
} 

private void OnKeyUp(object sender, KeyEventArgs e) 
{ 
    CheckShiftDepressed(); 

    if (m_DraggingResizingThumb) 
    { 
     OnAspectRatioResizingToggled(); 
    } 
} 
+0

Bienvenue dans SO, utilisateur 2880413. – Brian

+0

@Brian Merci, Brian. – user2880413

Répondre

0

J'ai résolu ceci.

Le RadDiagram de telerik (au moins dans ce cas) ne semble pas se décider si oui ou non il ou sa forme sélectionnée a le focus. Je ne sais pas pourquoi la forme sélectionnée peut sembler avoir le focus et être déplaçable, déplaçable, etc., si l'on a sélectionné l'adorner sélectionné, si le diagramme a le focus, et à d'autres moments, la forme sélectionnée a le focus .

L'appel manuel de Focus() sur la forme sélectionnée après avoir ajouté les gestionnaires de clé de haut en bas a résolu ce problème pour moi.

Questions connexes