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

Я показываю несколько 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?

Вот скриншот дерева:альтернативный текст

2 ответа

Решение

Я сделал это, окружив 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");
            }

    }

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

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

hitResult.VisualHit.GetType() == typeof(ModelVisual3D)
Другие вопросы по тегам