Мне нужен a Viewport3D
для единственной цели сделать геометрическое использование вычислений Petzold.Media3D.ViewportInfo
. Я предпочел бы не должным быть помещать его в a Window
или иначе представьте его.
Я пытаюсь выполнить это путем инстанцирования a Viewport3D
и установка нескольких свойств с помощью следующего метода C#:
private Viewport3D CreateViewport(MainSettings settings)
{
var cameraPosition = new Point3D(0, 0, settings.CameraHeight);
var cameraLookDirection = new Vector3D(0, 0, -1);
var cameraUpDirection = new Vector3D(0, 1, 0);
var camera = new PerspectiveCamera
{
Position = cameraPosition,
LookDirection = cameraLookDirection,
UpDirection = cameraUpDirection
};
var viewport = new Viewport3D
{
Camera = camera,
Width = settings.ViewportWidth,
Height = settings.ViewportHeight
};
return viewport;
}
Позже, я пытаюсь использовать эту область просмотра для преобразования местоположения мыши в 3D местоположение с помощью этого метода:
public Point3D? Point2dToPoint3d(Point point)
{
var range = new LineRange();
var isValid = ViewportInfo.Point2DtoPoint3D(_viewport, point, out range);
if (isValid)
return range.PointFromZ(0);
else
return null;
}
К сожалению, это не работает. Я думаю, что причина состоит в том что ActualWidth
и ActualHeight
из области просмотра и нуль (и это свойства только для чтения, таким образом, я не могу установить их вручную). (Отметьте: Я протестировал тот же самый метод с представленным фактическим Viewport3D
, и это хорошо работало, таким образом, я знаю, что проблема не с моим методом преобразователя.)
Любая идея, как я могу заставить WPF присваиваться ActualWidth
и ActualHeight
из управления на основе Width
и Height
настройки?
Я пытался установить HorizontalAlignment
и VerticalAlignment
кому: Left
и Top
, соответственно, и я также смешал с MinWidth
и MinHeight
, но ни одно из этих свойств не имело эффекта на ActualWidth
или ActualHeight
.
Из темы MSDN для свойства ActualWidth
:
Это свойство представляет собой вычисленное значение на основе других входных значений ширины и системы макета. Значение устанавливается самой системой макета на основе фактического прохода рендеринга , и поэтому может немного отставать от установленного значения свойств, таких как Ширина, которые являются основой изменения ввода.
Итак, похоже, что для установки свойства необходим проход отрисовки. Однако вы можете попробовать вызвать Measure (Size)
, а затем Arrange (Rect)
, чтобы смоделировать процесс компоновки. Может быть, этого уже достаточно.