0

创建可能具有关联事件,尤其是用户交互事件(如鼠标单击)的 TubeVisual3D 的正确方法是什么?

在 WPF C# 项目中使用 HelixToolKit。

谢谢

4

2 回答 2

2

下面我概述了一种对我有用的不同方法。我建议查看 UIElement3D 类。UIElement3D 类参考

开始了。

  • 创建一个扩展 UIElement3D 的类。
  • 在构造函数中创建管对象并将其分配给 Visual3DModel 成员。
  • 覆盖适合您需要的事件处理程序。

这是一个例子。

using System.Windows.Media;    
using System.Windows.Media.Media3D;

public InteractiveTubeVisual3D : UIElement3D
{
   public InteractiveTubeVisual3D( List<Point3D>paths, double tubeDiameter = 0.55)
   {
        int thetaDiv = 12;
        Material material = MaterialHelper.CreateMaterial( Colors.Crimson );

        MeshBuilder meshBuilder = new MeshBuilder();
        meshBuilder.AddTube(paths, tubeDiameter, thetaDiv, false);

        GeometryModel3D model = new GeometryModel3D( meshBuilder.ToMesh(), material);
        Visual3DModel = model;
   }

   protected override void OnMouseDown( MouseButtonEventArgs Event )
   {
       base.OnMouseDown( Event );
       //change the color of the tube when left mouse clicked, revert back on right mouse clicked
       if ( Event.LeftButton == MouseButtonState.Pressed )
       {
           GeometryModel3D
               tube = Visual3DModel as GeometryModel3D;
               tube.Material = MaterialHelper.CreateMaterial( Colors.CornflowerBlue );
       }
       else if ( Event.RightButton == MouseButtonState.Pressed )
       {
           GeometryModel3D
               tube = Visual3DModel as GeometryModel3D;
               tube.Material = MaterialHelper.CreateMaterial( Colors.Crimson );
       }

       Event.Handled = true;
   }

}

接下来的步骤说明了如何将其添加到您的场景中。

  • 创建一个 ContainerUIElemnt3D。ContainerUIElement3D 类参考
  • 将管子作为子项添加到 ContainerUIElement3D。
  • 添加 ContainerUIElement3D 对象作为 Helix 视口的子项。

示例程序

using System.Windows.Media.Media3D;
public partial class MainWindow : Window
{
    public MainWindow( )
    {
        InitializeComponent();

        ContainerUIElement3D container = new ContainerUIElement3D();

        List<Point3D> paths = CreatePath(); // pass in you tubes points. 

        InteractiveTubeVisual3D tube = new InteractiveTubeVisual3D(paths);
        container.Children.Add(tube);

        HelixViewPort.Children.Add(container);
    }
}

HelixViewPort 是 XAML 中的 x:Name 引用

<h:HelixViewport3D x:Name="HelixViewPort" >
    <h:DefaultLights/>
</h:HelixViewport3D>

希望能帮助到你 :)。祝你好运。

于 2016-01-27T13:48:05.947 回答
0

就在这里。您必须使用命中测试来确定鼠标单击是否在您的 TubeVisual3D 上,一旦您知道这一点,您就可以执行您想要的任何操作。这必须通过鼠标单击事件来完成...

于 2015-11-06T19:48:45.597 回答