使用 helix 工具包创建可点击对象

gol*_*007 3 c# wpf helix-3d-toolkit

我在 Helix Toolkit 上找到了一个例子,它被称为 ScatterPlot,它非常接近我真正需要的东西。但是我找不到任何关于如何向创建的对象(在本例中为球体)添加 onclick 事件侦听器的信息。这将球体添加到“游乐场”。

scatterMeshBuilder.AddSphere(Points[i], SphereSize, 4, 4);
Run Code Online (Sandbox Code Playgroud)

基本目标是为每个球体添加一个 onclick 事件侦听器,当用户选择一种颜色并单击这些球体中的一个时,它将更改为选定的颜色。可以向球体添加 onclick 侦听器(或与之相同的东西)。

Bri*_*ian 6

一年后......也许有人会发现这很有用。

一个对我有用的解决方案围绕扩展UIElement3D类,它有一堆可以覆盖的标准事件。例如 MouseEnter、MouseClick 等。来源如下。

using System.Windows; 
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using System.Windows.Controls.Primitives;
using System.Windows.Controls;

public class InteractivePoint : UIElement3D   
{
    public InteractivePoint(Point3D center, Material material, double sphereSize = 0.07)
    {
       MeshBuilder builder  = new MeshBuilder();

       builder.AddSphere( center, sphereSize , 4, 4 );
       GeometryModel3D model = new GeometryModel3D( builder.ToMesh(), material );
        Visual3DModel = model;
    }

    protected override void OnMouseEnter( MouseEventArgs event )
    {
        base.OnMouseEnter( event );

        GeometryModel3D point = Visual3DModel as GeometryModel3D;

        point.Material = Materials.Red; //change mat to red on mouse enter
        Event.Handled = true;
    }

    protected override void OnMouseLeave( MouseEventArgs event )
    {
        base.OnMouseEnter( event );

        GeometryModel3D point = Visual3DModel as GeometryModel3D;

        point.Material = Materials.Blue; //change mat to blue on mouse leave
        Event.Handled = true;
    }


}
Run Code Online (Sandbox Code Playgroud)

将它们添加到 Playground

Point3D[,] dataPoints = new Point3D[10,10]; // i will assume this has already been populated.
ContainerUIElement3D container;
Material defaultMaterial = Materaials.Blue;
for (int x = 0;x < 10; x++)
{
    for(int y = 0; y < 10; y++)
    {
        Point3D position = dataPoints [x, y];
        InteractivePoint  interactivePoint = new InteractivePoint( position, defaultMaterial );
        container.Children.Add( interactivePoint );
    }
}
Run Code Online (Sandbox Code Playgroud)

最后将容器作为子对象添加到 ModelVisual3D 对象。