Можно ли создать интерактивный TubeVisual3D в проекте HelixToolKit WPF?
Каков будет правильный способ создания TubeVisual3D, который мог бы иметь связанные события, особенно события взаимодействия с пользователем, такие как щелчки мыши?
Использование HelixToolKit в проекте WPF C#.
Спасибо
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;
}
}
Следующие шаги показывают, как добавить его в вашу сцену.
- Создать контейнер UIElemnt3D. Контейнер UIElement3D класс ref
- Добавьте пробирку в 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);
}
}
Helix ViewPort - это ссылка x:Name из XAML
<h:HelixViewport3D x:Name="HelixViewPort" >
<h:DefaultLights/>
</h:HelixViewport3D>
Надеюсь, поможет:). Удачи.
Да, есть. Вы должны использовать тест на попадание, чтобы выяснить, есть ли щелчок мыши на вашем TubeVisual3D, как только вы узнаете об этом, вы сможете выполнить любое действие, которое пожелаете. Это должно быть сделано через событие щелчка мыши...