![](/img/trans.png)
[英]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.