Как прикрутить MouseDown к ModelVisual3D? Возможно ли это, не трогая ModelUIElement3D?
По идее, несложно.
Во-первых, в 2D-контейнер положите Background="Transparent"
и подпишитесь на сообщения от мыши. В MouseDown
вы получите двухмерные координаты точки, в которой у вас произошло событие. Вам нужно найти, какому трёхмерному объекту это соответствует, вы должны запустить hittest-процедуру (то есть, выяснить, в какой точке луч, направленный из этой точки, пересечёт ваши фигуры).
Для этого воспользуйтесь процедурой VisualTreeHelper.HitTest
, которая «приведёт» вас к нужному трёхмерному элементу:
void OnMouseDown(object sender, MouseButtonEventArgs args)
{
Point pos = args.GetPosition(Viewport);
PointHitTestParameters pp = new PointHitTestParameters(mouseposition);
VisualTreeHelper.HitTest(Viewport, null, OnHit, pointparams);
}
(имя Viewport
соответствует, понятно, вашему Viewport3D
). Если ваш начальный элемент лежит не в 2D-области (например, это Viewport3D
), а в 3D-области, то вам понадобится использовать трёхмерные параметры, в которых задаётся не только начальная точка, но и направление:
RayHitTestParameters pp = new RayHitTestParameters(
new Point3D(mousePoint.X, mousePoint.Y, 0), new Vector3D(0, 0, 1));
Процедура OnHit
выглядит как-то так:
public HitTestResultBehavior OnHit(HitTestResult rawresult)
{
if (rawresult is RayHitTestResult rayresult) // если это 3D-результат
{
// то мы попали в какой-то 3D-объект, и можем с ним работать
var modelHit = rayresult.ModelHit;
// обрабатываем
return HitTestResultBehavior.Stop; // остановить поиск
}
return HitTestResultBehavior.Continue; // продолжить поиск
}
Литература:
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Сделал приложение Windows Forms, хочу использовать его как виджет на рабочем столе, но не могу закрепить его так, чтобы оно находилось всегда сзади...
На данный вопрос уже ответили:
Нужно подгружать разные нативные либы в зависимости от значения некоторой функцииНо название dll, которое указывается в DllImport, const, т
Скачал с сайта код проекта и подключил как на картинке, но visual studio не хочет видеть классыЧто и как поправить?