2009-10-10 4 views
0

J'écris une application que je travaille sur une fonctionnalité de skinning. Ce que je veux faire est de permettre à un utilisateur de créer un document XML que mon code va analyser et définir les propriétés des contrôles sur un formulaire. C'est la partie facile. Là où je suis coincé est de donner à l'utilisateur un moyen de trouver les noms/types de contrôle avec un effort de codage/documentation minimal.Méthode générique pour obtenir un nom de contrôle lorsqu'il est déplacé?

Mon idée était d'avoir une info-bulle qui quand ils ont passé la souris sur un contrôle, il a obtenu le nom du contrôle et le type à montrer. Quelqu'un sait-il un moyen de le faire? Je pensais à quelque chose comme Spy ++ peut trouver le contrôle, mais je veux aussi obtenir les propriétés .NET.

Si quelqu'un a une autre idée, je suis ouvert aux oreilles.

Merci beaucoup.

+0

Winforms ou WPF? –

+0

Winforms, désolé. – Dave

Répondre

0

Vous devez configurer des objets ToolTip (un pour chaque champ), en faisant défiler tous les contrôles de votre formulaire pour obtenir le texte de chaque info-bulle.

http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.aspx

+0

Pas vraiment la réponse que je cherchais, mais je suppose que ça marcherait. Je pensais quelque chose comme Control.GetChildAtPoint, mais il retourne toujours null. Dans le pire des cas, je suppose qu'une addition de chaque contrôle (meh ..) au moment de l'exécution et l'ajout d'une propriété tip d'outil fonctionneraient. Je vais marquer comme répondre plus tard, mais je veux vraiment voir s'il y a une meilleure façon. – Dave

0

Êtes-vous prêt à vous inscrire à chaque souris contrôles sur l'événement? Si oui, l'expéditeur serait le type, etc ... peut-être qu'il me manque quelque chose ici? En outre, vous pouvez obtenir le contrôle de l'arbre visuel dans WPF/SL, pourquoi ne pas passer sur WPF?

0

Vous pouvez installer récursivement un gestionnaire d'événement OnMouseOver. Ensuite, si un événement OnMouseOver se produit, le contrôle se trouve dans l'argument de l'expéditeur du gestionnaire d'événements.

+0

Cela fonctionnerait de la même manière que l'ajout récursif d'une info-bulle. – Dave

0

Pourquoi cela ne fonctionnerait-il pas? Je le mets dans la forme de base, ne vois pas vraiment ce qui ne fonctionnerait pas à côté de GetChildAtPoint étant bogué.

protected override void OnMouseMove(MouseEventArgs e) 
    { 
     Control c = this.GetChildAtPoint(e.Location); 
     if (c != null) 
     { 
      MessageBox.Show(String.Format("Your control name is: {0} and type is {1}.", c.Name, c.GetType().ToString())); 
     } 
     base.OnMouseMove(e); 
    } 
1

Compris. Le problème était dû au fait que l'emplacement de la souris n'était pas relatif à l'emplacement du client. Ainsi, le code ci-dessous résoudra ce problème. Je l'ai mis dans un fil de sondage que j'avais déjà, mais il devrait fonctionner avec une minuterie ou un autre événement. N'a pas fonctionné dans MouseMove pour une raison cependant. Merci à tous pour l'aide.

   Point p = this.PointToClient(MousePosition); 
       Control x = this.GetChildAtPoint(p); 
       if (x != null) 
       { 
        MessageBox.Show(x.GetType().ToString() + " - " + x.Name); 
       } 
Questions connexes