Возможно ли, чтобы элемент управления WPF имел ActualWidth и ActualHeight, если он никогда не отображался? - PullRequest
5 голосов
/ 01 июня 2010

Мне нужно 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 Ответ

5 голосов
/ 01 июня 2010

Из темы MSDN для свойства ActualWidth:

Это свойство является расчетным значением, основанным на других значениях ширины и системе макета. Значение устанавливается самой системой макета, на основе фактического прохода рендеринга , и поэтому может немного отставать от заданного значения свойств, таких как Ширина, которые являются основой изменения ввода.

Итак, это звучит так, будто проход для рендеринга необходим для установки свойства. Однако вы можете попытаться вызвать Measure(Size), а затем Arrange(Rect), чтобы смоделировать процесс макета. Может быть, этого уже достаточно.

...