WPF: Как пройтись по дереву визуалов, чтобы найти группу Model3D, в которой находится нажатая 3d-модель? - PullRequest
3 голосов
/ 22 сентября 2010

Я показываю несколько 3D-моделей как Model3DGroups.Они окружены Viewport3D, который перехватывает MouseDown-события.

Я хочу определить, какая Model3DGroup (все они имеют имена) была нажата.Я начинаю с этого:

        Point location = e.GetPosition(karte.ZAM3DViewport3D);
        HitTestResult hitResult = VisualTreeHelper.HitTest(karte.ZAM3DViewport3D, location);

        if (hitResult != null )
        {
            Debug.WriteLine("BREAKPOINT");
            // Hit the visual.
        }

После достижения точки останова, установленной командой WriteLine, я просматриваю локальное представление, чтобы найти правильную переменную, но не могу ее найти.Можете ли вы помочь мне выбрать путь, по которому мне нужно выбрать группу, к которой принадлежит модельvisual3d?

Вот скриншот дерева: alt text

Ответы [ 2 ]

1 голос
/ 26 сентября 2010

Я сделал это, окружив Model3DGroup ModelUIElement3D.

<ModelUIElement3D MouseDown="ModelUIElement3D_MouseDown" x:Name="LogoMouseDown">

функция MouseDown обрабатывает это следующим образом:

    private void ModelUIElement3D_MouseDown(object sender, MouseButtonEventArgs e)
    {

            if (sender == trololo)
            {
                RaiseModelClickEvent("auditorium");    
            }
            else if (sender == LogoMouseDown)
            {
                RaiseModelClickEvent("logo");
            }

    }
1 голос
/ 23 сентября 2010

Вы можете использовать Linq to Visual Tree , так как не имеет значения, является ли названный элемент, который вы ищете, Model3DGroup.Это просто еще один объект зависимости (если я понимаю ваш вопрос).

Проверьте тип результата, а затем LinqToVT, чтобы найти его предшественника XAML:

hitResult.VisualHit.GetType() == typeof(ModelVisual3D)
...