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)