Bonjour, je souhaite ajouter une info-bulle aux éléments enfants ViewPort3D lorsque je place ma souris dessus. Seul viewPort3D possède une propriété d'info-bulle, mais pas pour leurs enfants. Une façon de contourner le problème?Ajout d'une info-bulle aux éléments enfant ViewPort3D
Répondre
J'ai été en mesure d'obtenir une solution partielle en ajoutant une toile avec un bloc de texte à l'intérieur pour contenir mon texte. Comme ça ...
<Grid>
<Canvas>
<TextBlock Name="txtblkTip" TextAlignment="Center" Padding="2" />
</Canvas>
<Viewport3d ...
...
</Viewport3d>
</Grid>
Ensuite, lorsque l'utilisateur déplace la souris sur un objet dans Viewport3D J'utilise le gestionnaire d'événements de souris après pour redessiner l'info-bulle à l'endroit voulu, selon la méthode HitTest.
Private Sub viewport_PreviewMouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles viewport.PreviewMouseMove
Dim ptMouse As Point = e.GetPosition(viewport)
Dim result As HitTestResult = VisualTreeHelper.HitTest(viewport, ptMouse)
If TypeOf result Is RayMeshGeometry3DHitTestResult Then
Dim result3d As RayMeshGeometry3DHitTestResult = CType(result, RayMeshGeometry3DHitTestResult)
If TypeOf result3d.VisualHit Is Sphere Then
If CType(result3d.VisualHit, Sphere).Name <> "" Then
'Position the Canvas near the mouse pointer
Canvas.SetLeft(txtblkTip, ptMouse.X + 12)
Canvas.SetTop(txtblkTip, ptMouse.Y + 12)
txtblkTip.Text = CType(result3d.VisualHit, Sphere).Name
End If
End If
End If
End Sub
Une chose que je ne l'ai pas été en mesure d'obtenir est un événement lorsque la souris se déplace de tous les objets dans la fenêtre d'affichage, pour enlever l'info-bulle, mais je soupçonne que cela pourrait se faire avec un story-board.
J'espère que cela vous aidera tout au long du processus.
La réponse de XamTrix fonctionne avec l'ajout d'un gestionnaire d'événement MouseLeave qui définit la visibilité du bloc de texte sur Visibility.Collapsed (la visibilité du bloc de texte doit également être réinitialisée à Visible dans le gestionnaire d'événements PreviewMouseMove).
De même, si le Canevas est placé après le Viewport3d au lieu de le précéder, le bloc de texte apparaîtra au-dessus des éléments Viewport3d. Dans ce cas, l'instruction Canvas.SetLeft doit être remplacée par: ptMouse.X + 12 - viewport3d.actualWidth.