简体   繁体   English

ViewPort3D:如何从后面的代码中创建带有文本的WPF对象(多维数据集)

[英]ViewPort3D: How to create a WPF Object (Cube) with text on it from Code behind

I want to draw a set of 3D-Cubes, each Cube should display a name and also should have its own event handler when the cube is selected. 我想绘制一组3D多维数据集,每个多维数据集都应显示一个名称,并且在选择多维数据集时也应具有自己的事件处理程序。

Is it possible to implement it using code behind or xaml binding? 是否可以使用背后的代码或xaml绑定实现它?

To draw a 3D cube from code behind I would use the Helix3D toolkit CubeVisual3D. 要从背后的代码绘制3D立方体,我将使用Helix3D工具箱CubeVisual3D。 However if you want to stick with stock WPF 3D elements it is fairly simple to implement. 但是,如果您要坚持使用现有的WPF 3D元素,则实现起来非常简单。

start here to Learn about Text in 3D enviroments http://www.codeproject.com/Articles/33893/WPF-Creation-of-Text-Labels-for-3D-Scene which will guide you through two different approaches to adding Text to a 3D image and I find very helpful. 从此处开始了解3D环境中的文本http://www.codeproject.com/Articles/33893/WPF-Creation-of-Text-Labels-for-3D-Scene ,它将指导您通过两种不同的方法将文本添加到3D图像,我发现非常有帮助。

For a cube Just use a RectangleVisual3D object Something like this. 对于多维数据集,只需使用RectangleVisual3D对象即可。

    RectangleVisual3D myCube = new RectangleVisual3D();
    myCube.Origin = new Point3D(0, 0, 0); //Set this value to whatever you want your Cube Origen to be.
    myCube.Width = 5; //whatever width you would like.
    myCube.Length = 5; //Set Length = Width
    myCube.Normal = new Vector3D(0, 1, 0); // if you want a cube that is not at some angle then use a vector in the direction of an axis such as this one or <1,0,0> and <0,0,1>
    myCube.LengthDirection = new Vector3D(0, 1, 0); //This will depend on the orientation of the cube however since it is equilateral just set it to the same thing as normal.
    myCube.Material = new DiffuseMaterial(Brushes.Red); // Set this with whatever you want or just set the myCube.Fill Property with a brush type.

Too add the event handler I believe you must add the Handler to the Viewport3D. 太添加了事件处理程序,我相信您必须将处理程序添加到Viewport3D。 Something of this nature should work. 这种性质的东西应该起作用。

    public Window1()
    {
    InitializeComponent();
    this.mainViewport.MouseDown += new MouseButtonEventHandler(mainViewport_MouseDown);
    this.mainViewport.MouseUp += new MouseButtonEventHandler(mainViewport_MouseUp);
    }

Then Add this function 然后添加此功能

    ModelVisual3D GetHitResult(Point location)
    {
    HitTestResult result = VisualTreeHelper.HitTest(mainViewport, location);
    if(result != null && result.VisualHit is ModelVisual3D)
    {
    ModelVisual3D visual = (ModelVisual3D)result.VisualHit;
    return visual;
    }

    return null;
    }

Then Add in the Event Handlers 然后添加事件处理程序

    void mainViewport_MouseUp(object sender, MouseButtonEventArgs e)
    {
    Point location = e.GetPosition(mainViewport);
    ModelVisual3D result = GetHitResult(location);
    if(result == null)
    {
    return;
    }
    //Do Stuff Here
    }

    void mainViewport_MouseDown(object sender, MouseButtonEventArgs e)
    {
    Point location = e.GetPosition(mainViewport);
    ModelVisual3D result = GetHitResult(location);
    if(result == null)
    {
    return;
    }
    //Do Stuff Here
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM