[英]Adding a child to Viewport3D asynchronously gives “This API was accessed with arguments from the wrong context.”
[英]Adding ToolTip to ViewPort3D child elements
嗨,当我将鼠标放在ViewPort3D子元素上时,我想向其添加工具提示,只有viewPort3D具有tooltip属性,但不适用于其子元素。 有什么解决方法吗?
XamTrix的答案与添加一个MouseLeave事件处理程序一起使用,该事件处理程序将文本块的可见性设置为Visibility.Collapsed(还必须在PreviewMouseMove事件处理程序中将文本块的可见性重置为Visible)。
另外,如果将Canvas放置在Viewport3d之后而不是它之前,则文本块将出现在Viewport3d元素上方。 在这种情况下,Canvas.SetLeft语句应更改为:ptMouse.X + 12-viewport3d.actualWidth。
通过添加内部带有文本块的画布来保存文本,我能够得到部分解决方案。 像这样...
<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
我无法获得的一件事是当鼠标移开视口中的所有对象以删除工具提示时发生的事件,但是我怀疑这可以通过情节提要完成。
希望这对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.