Возможно ли, чтобы элемент управления WPF имел ActualWidth и ActualHeight, если он никогда не отображался?
Мне нужно Viewport3D
с единственной целью выполнения геометрических расчетов с использованием Petzold.Media3D.ViewportInfo
, Я бы предпочел не размещать его в Window
или иным образом сделать это.
Я пытаюсь сделать это путем создания экземпляра 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;
}
Позже я пытаюсь использовать этот видовой экран для преобразования местоположения мыши в трехмерное местоположение, используя этот метод:
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
,
1 ответ
Из темы MSDN для ActualWidth
имущество:
Это свойство является расчетным значением, основанным на других значениях ширины и системе макета. Значение задается самой системой макетов на основе фактического прохода рендеринга и поэтому может немного отставать от заданного значения свойств, таких как Ширина, которые являются основой изменения ввода.
Таким образом, это звучит как проход рендеринга, необходимый для установки свойства. Тем не менее, вы можете попробовать позвонить Measure(Size)
а потом Arrange(Rect)
смоделировать процесс верстки. Может быть, этого уже достаточно.