Возможно ли, чтобы элемент управления 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) смоделировать процесс верстки. Может быть, этого уже достаточно.

Другие вопросы по тегам