将ToolTip添加到ViewPort3D子元素

时间:2009-08-26 23:33:28

标签: wpf 3d tooltip

您好我想将鼠标悬停在ViewPort3D子元素上的工具提示,只有viewPort3D有一个工具提示属性但不适合他们的孩子。有什么方法可以解决它吗?

2 个答案:

答案 0 :(得分:0)

我能够通过添加带有文本块的画布来获得部分解决方案来保存我的文本。像这样......

<Grid>
    <Canvas>
        <TextBlock Name="txtblkTip" TextAlignment="Center" Padding="2" />
    </Canvas>
    <Viewport3d ... 
        ...
    </Viewport3d>
</Grid>

然后当用户将鼠标移到viewport3d中的对象上时,我使用以下鼠标事件处理程序根据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

我无法得到的一件事是当鼠标离开视口中的所有对象时移除工具提示的事件,但我怀疑这可以通过故事板完成。

希望这可以帮助你。

答案 1 :(得分:0)

XamTrix的答案适用于添加MouseLeave事件处理程序,该处理程序将文本块的可见性设置为Visibility.Collapsed(文本块的可见性) 必须在PreviewMouseMove事件处理程序中重置为Visible。

此外,如果Canvas放在Viewport3d之后而不是之前,则为textblock 将出现在Viewport3d元素上方。在这种情况下,Canvas.SetLeft语句 应更改为:ptMouse.X + 12 - viewport3d.actualWidth。